[
  {
    "path": ".gitignore",
    "content": "TAGS\n*~\n_*\n.DS_Store\nnode_modules\nplayground\n*.svg"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"third-party/mocha\"]\n\tpath = third-party/mocha\n\turl = https://github.com/visionmedia/mocha.git\n[submodule \"third-party/eve\"]\n\tpath = third-party/eve\n\turl = https://github.com/adobe-webplatform/eve.git\n[submodule \"third-party/expect\"]\n\tpath = third-party/expect\n\turl = https://github.com/LearnBoost/expect.js.git\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"node\"\n\nsudo: true\n\nbefore_script:\n  - npm install -g grunt-cli\n  - npm install\n  - grunt\n  - cd test\n\nscript: phantomjs test.js\n\nnotifications:\n  slack: snapsvg:1zY6dZQuE1vhnug8pLSbbYMv\n"
  },
  {
    "path": "CONTRIBUTING",
    "content": "Contributions to this code are covered by the Adobe contributors\nlicense agreement. Developers must sign and submit the Adobe CLA in\norder to contribute to this project.\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "module.exports = function(grunt) {\n\n    var pkg = grunt.file.readJSON(\"package.json\"),\n        core = [\n            \"./src/mina.js\",\n            \"./src/svg.js\",\n            \"./src/element.js\",\n            \"./src/animation.js\",\n            \"./src/matrix.js\",\n            \"./src/attr.js\",\n            \"./src/class.js\",\n            \"./src/attradd.js\",\n            \"./src/paper.js\",\n            \"./src/path.js\",\n            \"./src/set.js\",\n            \"./src/equal.js\",\n            \"./src/mouse.js\",\n            \"./src/filter.js\",\n            \"./src/align.js\",\n            \"./src/colors.js\"\n        ],\n        src = [\n            \"./node_modules/eve/eve.js\",\n            \"./src/amd-banner.js\",\n            \"./src/amd-footer.js\"\n        ];\n\n    src.splice(2, 0, core);\n    // Project configuration.\n    grunt.initConfig({\n        // Metadata.\n        pkg: pkg,\n        banner: grunt.file.read(\"./src/copy.js\")\n            .replace(/@VERSION/, pkg.version)\n            .replace(/@DATE/, grunt.template.today(\"yyyy-mm-dd\")) + \"\\n\",\n        // Task configuration.\n        uglify: {\n            options: {\n                banner: \"<%= banner %>\",\n                report: \"min\"\n            },\n            dist: {\n                src: \"<%= concat.target.dest %>\",\n                dest: \"dist/snap.svg-min.js\"\n            }\n        },\n        concat: {\n            options: {\n                banner: \"<%= banner %>\"\n            },\n            target: {\n                dest: \"dist/snap.svg.js\",\n                src: src\n            }\n        },\n        exec: {\n            dr: {\n              command: \"node node_modules/dr.js/dr dr.json\"\n            },\n            test: {\n              command: \"cd test; phantomjs test.js\"\n            },\n            eslint: {\n                command: \"./node_modules/eslint/bin/eslint.js \" + core.join(\" \")\n            },\n        },\n        prettify: {\n            options: {\n                indent: 4,\n                indent_char: \" \",\n                wrap_line_length: 80,\n                brace_style: \"expand\",\n                unformatted: [\"code\", \"pre\", \"script\"]\n            },\n            one: {\n                src: \"./doc/reference.html\",\n                dest: \"./doc/reference.html\"\n            }\n        }\n    });\n\n    grunt.loadNpmTasks(\"grunt-contrib-concat\");\n    grunt.loadNpmTasks(\"grunt-contrib-uglify\");\n    grunt.loadNpmTasks(\"grunt-exec\");\n    grunt.loadNpmTasks(\"grunt-prettify\");\n\n    grunt.registerTask(\"default\", [\"exec:eslint\", \"concat\", \"uglify\", \"exec:dr\", \"prettify\"]);\n    grunt.registerTask(\"lint\", [\"exec:eslint\"]);\n    grunt.registerTask(\"test\", [\"exec:test\"]);\n};\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2013 Adobe Systems Incorporated\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "NOTICE",
    "content": "Snap.svg is licensed under the Apache license version 2.0, January 2004  (see LICENSE file).\n\nSnap.svg uses the following third party libraries that may have licenses \ndiffering from that of Snap.svg itself. You can find the libraries and their\nrespective licenses below.\n\n - eve ./node_modules/eve\n\n    https://github.com/adobe-webplatform/eve/\n\n    Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n - Mocha ./node_modules/mocha\n\n    https://github.com/visionmedia/mocha/\n    \n    (The MIT License)\n\n    Copyright (c) 2011-2013 TJ Holowaychuk <tj@vision-media.ca>\n\n    Permission is hereby granted, free of charge, to any person obtaining\n    a copy of this software and associated documentation files (the\n    'Software'), to deal in the Software without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Software, and to\n    permit persons to whom the Software is furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n - Expect ./node_modules/expect.js\n\n    https://github.com/LearnBoost/expect.js\n\n    (The MIT License)\n\n    Copyright (c) 2011 Guillermo Rauch <guillermo@learnboost.com>\n\n    Permission is hereby granted, free of charge, to any person obtaining\n    a copy of this software and associated documentation files (the\n    'Software'), to deal in the Software without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Software, and to\n    permit persons to whom the Software is furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n - Grunt ./node_modules/grunt\n\n    http://gruntjs.com\n\n    Copyright (c) 2013 \"Cowboy\" Ben Alman\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\n\n - Backbone ./demos/animated-game/js/backbone.js\n\n    http://backbonejs.org/\n\n    (The MIT License)\n\n\tCopyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud\n\n    Permission is hereby granted, free of charge, to any person obtaining\n    a copy of this software and associated documentation files (the\n    'Software'), to deal in the Software without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Software, and to\n    permit persons to whom the Software is furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n - Underscore ./demos/animated-game/js/underscore.js\n\n    http://underscorejs.org\n\n    (The MIT License)\n\n\tCopyright (c) 2010-2013 Jeremy Ashkenas, DocumentCloud\n\n    Permission is hereby granted, free of charge, to any person obtaining\n    a copy of this software and associated documentation files (the\n    'Software'), to deal in the Software without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Software, and to\n    permit persons to whom the Software is furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n - jQuery ./demos/animated-game/js/jquery-1.9.0.min.js\n\n    http://http://jquery.com/\n\n    (The MIT License)\n\n\tCopyright 2013 jQuery Foundation and other contributors\n\thttp://jquery.com/\n\n    Permission is hereby granted, free of charge, to any person obtaining\n    a copy of this software and associated documentation files (the\n    'Software'), to deal in the Software without restriction, including\n    without limitation the rights to use, copy, modify, merge, publish,\n    distribute, sublicense, and/or sell copies of the Software, and to\n    permit persons to whom the Software is furnished to do so, subject to\n    the following conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "[Snap.svg](http://snapsvg.io) · [![Build Status](https://travis-ci.org/adobe-webplatform/Snap.svg.svg?branch=dev)](https://travis-ci.org/adobe-webplatform/Snap.svg)  [![CDNJS](https://img.shields.io/cdnjs/v/snap.svg.svg)](https://cdnjs.com/libraries/snap.svg/) [![GitHub Tag](https://img.shields.io/github/tag/adobe-webplatform/snap.svg.svg)](https://github.com/adobe-webplatform/Snap.svg/releases) [![License](https://img.shields.io/npm/l/snapsvg.svg)](https://github.com/adobe-webplatform/Snap.svg/blob/master/LICENSE)\n======\n\nA JavaScript SVG library for the modern web. Learn more at [snapsvg.io](http://snapsvg.io).\n\n[Follow us on Twitter.](https://twitter.com/snapsvg)\n\n### Install\n* [Bower](http://bower.io/) - `bower install snap.svg` ![Bower](https://img.shields.io/bower/v/snap.svg.svg)\n* [npm](http://npmjs.com/) - `npm install snapsvg` [![npm version](https://img.shields.io/npm/v/snapsvg.svg?style=flat)](https://www.npmjs.com/package/snapsvg) [![Downloads](https://img.shields.io/npm/dt/snapsvg.svg)](https://www.npmjs.com/package/snapsvg)\n* Manual Minified - https://github.com/adobe-webplatform/Snap.svg/raw/master/dist/snap.svg-min.js\n* Manual Unminified - https://raw.githubusercontent.com/adobe-webplatform/Snap.svg/master/dist/snap.svg.js\n\n\n### Learn\n\n* [About Snap.svg](http://snapsvg.io/about/)\n* [Getting Started](http://snapsvg.io/start/)\n* [API Reference](http://snapsvg.io/docs/)\n* [Slack Room](https://snapsvg.slack.com/). [Invite](https://snapsvg.slack.com/shared_invite/MTM2NTE4MTk3MDYwLTE0ODYwODgzNzUtYjQ0YmM1N2U0Mg)\n\n### Use\n\nIn your HTML file, load simply by:\n```html\n<script src=\"snap.svg-min.js\"></script>\n```\nNo other scripts are needed. Both the minified and uncompressed (for development) versions are in the `/dist` folder.\n\n#### webpack\nTo load with webpack 2.x and 3.x, install [Imports Loader](https://github.com/webpack-contrib/imports-loader) (`npm i -D imports-loader`), and add the following to your webpack config:\n\n```js\nmodule: {\n  rules: [\n    {\n      test: require.resolve('snapsvg/dist/snap.svg.js'),\n      use: 'imports-loader?this=>window,fix=>module.exports=0',\n    },\n  ],\n},\nresolve: {\n  alias: {\n    snapsvg: 'snapsvg/dist/snap.svg.js',\n  },\n},\n```\n\nThen, in any module you’d like to require Snap, use:\n```\nimport Snap from 'snapsvg';\n```\n\n### Build\n[![Build Status](https://travis-ci.org/adobe-webplatform/Snap.svg.svg?branch=dev)](https://travis-ci.org/adobe-webplatform/Snap.svg)\n\nSnap.svg uses [Grunt](http://gruntjs.com/) to build.\n\n* Open the terminal from the Snap.svg directory:\n```sh\ncd Snap.svg\n```\n* Install its command line interface (CLI) globally:\n```sh\nnpm install -g grunt-cli\n```\n_*You might need to use `sudo npm`, depending on your configuration._\n\n* Install dependencies with npm:\n```sh\nnpm install\n```\n_*Snap.svg uses Grunt 0.4.0. You might want to [read](http://gruntjs.com/getting-started) more on their website if you haven’t upgraded since a lot has changed._\n\n* To build the files run\n```sh\ngrunt\n```\n* The results will be built into the `dist` folder.\n* Alternatively type `grunt watch` to have the build run automatically when you make changes to source files.\n\n### Testing\n\nTests are located in `test` folder. To run tests, simply open `test.html` in there. Automatic tests use PhantomJS to scrap this file, so you can use it as a reference.\n\nAlternatively, install [PhantomJS](http://phantomjs.org) and run command\n```sh\ngrunt test\n```\n\n### Contribute\n\n* [Fill out the CLA](http://snapsvg.io/contributions/).\n* [Fork](https://help.github.com/articles/fork-a-repo) the repo.\n* Create a branch:\n```sh\ngit checkout -b my_branch\n```\n* Add your changes.\n* Check that tests are passing\n* Commit your changes:\n```sh\ngit commit -am \"Added some awesome stuff\"\n```\n* Push your branch:\n```sh\ngit push origin my_branch\n```\n* Make a [pull request](https://help.github.com/articles/using-pull-requests) to `dev`(!) branch.\n\n*Note:* Pull requests to other branches than `dev` or without filled CLA wouldn’t be accepted.\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"Snap.svg\",\n  \"version\": \"0.5.1\",\n  \"homepage\": \"http://snapsvg.io\",\n  \"authors\": [\n    \"Dmitry Baranovskiy <dmitry@baranovskiy.com>\"\n  ],\n  \"description\": \"The JavaScript library for modern SVG graphics\",\n  \"main\": \"dist/snap.svg-min.js\",\n  \"keywords\": [\n    \"svg\",\n    \"snap\",\n    \"js\",\n    \"javascript\"\n  ],\n  \"license\": \"Apache 2\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"demos\",\n    \"src\"\n  ]\n}\n"
  },
  {
    "path": "component.json",
    "content": "{\n  \"name\": \"Snap.svg\",\n  \"repo\": \"adobe-webplatform/Snap.svg\",\n  \"description\": \"The JavaScript library for modern SVG graphics.\",\n  \"version\": \"0.5.1\",\n  \"keywords\": [\"svg\", \"snap\", \"js\", \"javascript\"],\n  \"dependencies\": {},\n  \"development\": {},\n  \"main\": \"dist/snap.svg-min.js\",\n  \"scripts\": [\n    \"dist/snap.svg-min.js\"\n  ]\n}\n"
  },
  {
    "path": "demos/animated-game/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t    <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n\n\t Licensed under the Apache License, Version 2.0 (the “License”);\n\t you may not use this file except in compliance with the License.\n\t You may obtain a copy of the License at\n\n\t http://www.apache.org/licenses/LICENSE-2.0\n\n\t Unless required by applicable law or agreed to in writing, software\n\t distributed under the License is distributed on an “AS IS” BASIS,\n\t WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t See the License for the specific language governing permissions and\n\t limitations under the License.\">\n\t\n\t\t<title>illustration</title>\n\t\t<style>\n\t\t\tbody{\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\tbackground: #b7bf76;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t\n\t\t\tsvg{\n\t\t\t\tdisplay: block;\n\t\t\t\tmargin: auto;\n\t\t\t\t-webkit-transform-origin: top center;\n\t\t\t\t-webkit-transform: scale(1.5);\n\t\t\t\t-moz-transform-origin: top center;\n\t\t\t\t-moz-transform: scale(1.5);\n\t\t\t}\n\t\t\t\n\t\t\t.hit-area{\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t\n\t\t\t.face .mouth{\n\t\t\t\t-webkit-transform-origin: 0px 4px;\n\t\t\t\t-webkit-transition: -webkit-transform .4s;\n\t\t\t\t-webkit-transform: scale(1, 0);\n\t\t\t\t-moz-transform-origin: 0px 4px;\n\t\t\t\t-moz-transition: -webkit-transform .4s;\n\t\t\t\t-moz-transform: scale(1, 0);\n\t\t\t}\n\t\t\t\n\t\t\t.face .eye.right{\n\t\t\t\t-webkit-transform-origin: 8px -4px;\n\t\t\t\t-moz-transform-origin: 8px -4px;\n\t\t\t}\n\t\t\t\n\t\t\t.face .eye.left{\n\t\t\t\t-webkit-transform-origin: -8px -4px;\n\t\t\t\t-moz-transform-origin: -8px -4px;\n\t\t\t}\n\t\t\t\n\t\t\t.face .eye{\n\t\t\t\t-webkit-transition: -webkit-transform .2s;\n\t\t\t\t-webkit-transform: scale(1, 0);\n\t\t\t\t-moz-transition: -webkit-transform .2s;\n\t\t\t\t-moz-transform: scale(1, 0);\n\t\t\t}\n\t\t\t\n\t\t\t@-webkit-keyframes breeze{\n\t\t\t\t0% {\n\t\t\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\t-webkit-transform: rotate(10deg);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\t-webkit-transform: rotate(0deg);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@-moz-keyframes breeze{\n\t\t\t\t0% {\n\t\t\t\t\t-moz-transform: rotate(0deg);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\t-moz-transform: rotate(10deg);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\t-moz-transform: rotate(0deg);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@-webkit-keyframes blink{\n\t\t\t\t0% {\n\t\t\t\t\t-webkit-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t\t10% {\n\t\t\t\t\t-webkit-transform: scale(1, 1);\n\t\t\t\t}\n\t\t\t\t90% {\n\t\t\t\t\t-webkit-transform: scale(1, 1);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\t-webkit-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@-moz-keyframes blink{\n\t\t\t\t0% {\n\t\t\t\t\t-moz-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t\t10% {\n\t\t\t\t\t-moz-transform: scale(1, 1);\n\t\t\t\t}\n\t\t\t\t90% {\n\t\t\t\t\t-moz-transform: scale(1, 1);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\t-moz-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@-webkit-keyframes talk{\n\t\t\t\t0% {\n\t\t\t\t\t-webkit-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\t-webkit-transform: scale(1, 1);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\t-webkit-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@-moz-keyframes talk{\n\t\t\t\t0% {\n\t\t\t\t\t-moz-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\t-moz-transform: scale(1, 1);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\t-moz-transform: scale(1, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t.tree{\n\t\t\t\t-webkit-transform-origin: 50% 100%;\n\t\t\t\t-webkit-animation: breeze 2s ease-out infinite;\n\t\t\t\t-moz-transform-origin: 50% bottom;\n\t\t\t\t/*-moz-animation: breeze 2s ease-out infinite;*/\n\t\t\t}\n\t\t\t\n\t\t\t.tree .face.animating .eye{\n\t\t\t\t-webkit-transform: scale(1, 1);\n\t\t\t\t-moz-transform: scale(1, 1);\n\t\t\t}\n\t\t\t\n\t\t\t.face.animating .eye{\n\t\t\t\t-webkit-animation: blink 5s infinite;\n\t\t\t\t-moz-animation: blink 5s infinite;\n\t\t\t}\n\t\t\t\n\t\t\t.face.animating .mouth{\n\t\t\t\t-webkit-animation: talk 1s infinite;\n\t\t\t\t-moz-animation: talk 1s infinite;\n\t\t\t}\n\t\t\t\n\t\t\t#cube-hitarea{\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 100px;\n\t\t\t\tleft: 100px;\n\t\t\t\twidth: 125px;\n\t\t\t\theight: 125px;\t\n\t\t\t\tcursor: pointer;\t\t\n\t\t\t}\n\t\t\t\n\t\t\t#cube{\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 25px;\n\t\t\t\ttop: 25px;\n\t\t\t\twidth: 74px;\n\t\t\t\theight: 74px;\n\t\t\t\tz-index: 100;\n\t\t\t\tbackface-visibility: visible;\n\t\t\t\tpointer-events: none;\n\t\t\t\t-webkit-transform-style: preserve-3d;\n\t\t\t\t-webkit-transform-origin: center center;\n\t\t\t\t-webkit-backface-visibility: visible;\n\t\t\t\t-webkit-transform: rotateX(-45deg) rotateY(50deg);\n\t\t\t\t-webkit-transition: -webkit-transform 1s;\n\t\t\t\t-moz-transform-style: preserve-3d;\n\t\t\t\t-moz-transform-origin: center center;\n\t\t\t\t-moz-backface-visibility: visible;\n\t\t\t\t-moz-transform: rotateX(-45deg) rotateY(50deg);\n\t\t\t\t-moz-transition: -moz-transform 1s;\n\t\t\t}\n\t\t\t\n\t\t\t.side{\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 74px;\n\t\t\t\theight: 74px;\n\t\t\t\tpointer-events: none;\n\t\t\t\tbackface-visibility: visible;\n\t\t\t\t-webkit-transform-origin: center center;\n\t\t\t\t-webkit-backface-visibility: visible;\n\t\t\t\t-moz-transform-origin: center center;\n\t\t\t\t-moz-backface-visibility: visible;\n\t\t\t}\n\t\t\t\n\t\t\t.side *{\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t\t\n\t\t\t#cube .side:nth-child(1) {\n\t\t\t\t-webkit-transform: translateY(37px) rotateX(90deg);\n\t\t\t\t-moz-transform: translateY(37px) rotateX(90deg);\n\t\t\t}\n\t\t\t\n\t\t\t#cube .side:nth-child(2) {\n\t\t\t\t-webkit-transform: translateY(-37px) rotateX(-90deg);\n\t\t\t\t-moz-transform: translateY(-37px) rotateX(-90deg);\n\t\t\t\t\n\t\t\t}\n\t\t\n\t\t\t#cube .side:nth-child(3) {\t\t\t\t\n\t\t\t\t-webkit-transform: translateX(37px) rotateY(-90deg);\n\t\t\t\t-moz-transform: translateX(37px) rotateY(-90deg);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t#cube .side:nth-child(4) {\t\t\t\t\n\t\t\t\t-webkit-transform: translateX(-37px) rotateY(-90deg);\n\t\t\t\t-moz-transform: translateX(-37px) rotateY(-90deg);\n\t\t\t}\n\t\t\t\n\t\t\t#cube .side:nth-child(5) {\t\n\t\t\t\t-webkit-transform: translateZ(37px) rotateZ(90deg);\n\t\t\t\t-moz-transform: translateZ(37px) rotateZ(90deg);\n\t\t\t}\n\t\t\t\n\t\t\t#cube .side:nth-child(6) {\t\t\t\n\t\t\t\t-webkit-transform: translateZ(-37px) rotateZ(0deg);\n\t\t\t\t-moz-transform: translateZ(-37px) rotateZ(0deg);\n\t\t\t}\n\t\t\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"500px\"\n\t\t\t height=\"500px\" viewBox=\"0 0 500 500\" enable-background=\"new 0 0 500 500\" xml:space=\"preserve\">\n\t\t\n\t\t<g id=\"Layer_1\">\n\t\t\t<rect x=\"1.103\" y=\"-3.397\" fill=\"#B7C077\" width=\"498.897\" height=\"503.397\"/>\n\t\t\t<polygon fill=\"#8FA268\" points=\"418.781,75.171 403.456,67.284 371.524,101.763 386.849,109.65 \t\"/>\n\t\t\t<polygon fill=\"#8FA268\" points=\"455.281,94.171 439.956,86.284 408.024,120.763 423.349,128.65 \t\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M307.422,349.64c2.285-1.785,5.976-0.877,8.245,2.027s2.255,6.705-0.03,8.49\n\t\t\t\t\tc-2.285,1.785-11.397,0.436-11.397,0.436S305.137,351.425,307.422,349.64z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M322.176,351.605c0,2.9-3.246,5.25-7.25,5.25s-7.25-2.35-7.25-5.25c0-2.899,7.25-9.25,7.25-9.25\n\t\t\t\t\tS322.176,348.706,322.176,351.605z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M315.638,343c0.56,1.102,4.291,8.604,3.316,11.104c-0.551,1.413-1.879,2.357-3.551,2.734\n\t\t\t\t\t\tc3.781-0.179,6.774-2.45,6.774-5.233C322.176,349.266,317.461,344.685,315.638,343z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M315.501,342.874c-0.351-0.322-0.574-0.518-0.574-0.518s-0.585,0.515-1.411,1.303\n\t\t\t\t\t\tC314.567,343.22,315.325,342.938,315.501,342.874z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<path fill=\"#B7AA92\" d=\"M448.987,144.849c11.418,1.436,26.354-1.275,32.959,6.957c6.697,8.347,11.56,23.593,10.135,34.927\n\t\t\t\tc-1.426,11.333-7.266,28.424-15.822,34.852c-8.438,6.34-26.34,8.047-37.757,6.611c-11.418-1.436-32.753-3.982-39.358-12.215\n\t\t\t\tc-6.697-8.347,14.278-27.631,15.704-38.964c1.426-11.333-9.795-29.455-1.239-35.883\n\t\t\t\tC422.048,134.793,437.569,143.412,448.987,144.849z\"/>\n\t\t\t<path fill=\"#1DA2C7\" d=\"M446.987,147.849c11.418,1.436,26.354-1.275,32.959,6.957c6.697,8.347,11.56,23.593,10.135,34.927\n\t\t\t\tc-1.426,11.333-7.266,28.424-15.822,34.852c-8.438,6.34-26.34,8.047-37.757,6.611c-11.418-1.436-32.753-3.982-39.358-12.215\n\t\t\t\tc-6.697-8.347,14.278-27.631,15.704-38.964c1.426-11.333-9.795-29.455-1.239-35.883\n\t\t\t\tC420.048,137.793,435.569,146.412,446.987,147.849z\"/>\n\t\t\t<path fill=\"#188BAB\" d=\"M479.946,154.806c-6.605-8.232-21.542-5.521-32.959-6.957c-11.418-1.436-26.939-10.056-35.378-3.716\n\t\t\t\tc-1.42,1.067-2.287,2.462-2.765,4.089c8.765-2.002,21.436,4.406,31.143,5.627c11.418,1.436,26.354-1.275,32.959,6.957\n\t\t\t\tc6.697,8.347,11.56,23.593,10.135,34.927c-1.176,9.346-5.356,22.603-11.584,30.571c0.994-0.534,1.935-1.098,2.762-1.719\n\t\t\t\tc8.556-6.428,14.396-23.519,15.822-34.852C491.507,178.399,486.644,163.153,479.946,154.806z\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M141.244,332.65l5.092,6.17l9.996-8.312c0.023-0.018,0.05-0.027,0.072-0.046\n\t\t\t\t\tc1.341-1.106,1.322-3.343-0.042-4.995s-3.556-2.095-4.896-0.988C151.261,324.648,141.244,332.65,141.244,332.65z\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M143.154,334.964l12.684-10.036c-1.354-1.194-3.192-1.423-4.372-0.449\n\t\t\t\t\tc-0.205,0.169-10.222,8.171-10.222,8.171L143.154,334.964z\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M128.41,330.061c5.75-4.746,14.259-3.932,19.005,1.819c4.746,5.75,3.932,14.259-1.819,19.005\n\t\t\t\t\tc-5.75,4.746-29.031,6.456-29.031,6.456S122.66,334.807,128.41,330.061z\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M116.565,357.341c0,0,0.07-0.005,0.176-0.014c1.86-4.138,9.678-20.974,15.261-24.357\n\t\t\t\t\tc6.072-3.679,13.88-1.998,17.949,3.676c-0.5-1.695-1.341-3.319-2.536-4.767c-4.746-5.75-13.255-6.565-19.005-1.819\n\t\t\t\t\tC122.66,334.807,116.565,357.341,116.565,357.341z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M137.623,221.277l2.694,3.265l5.289-4.398c0.012-0.009,0.026-0.015,0.038-0.024\n\t\t\t\t\t\tc0.709-0.585,0.699-1.769-0.022-2.643c-0.722-0.874-1.881-1.108-2.591-0.523C142.923,217.043,137.623,221.277,137.623,221.277z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M138.633,222.501l6.711-5.31c-0.716-0.632-1.689-0.753-2.313-0.238c-0.108,0.089-5.408,4.324-5.408,4.324\n\t\t\t\t\t\tL138.633,222.501z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M130.832,219.907c3.043-2.511,7.545-2.08,10.056,0.962c2.511,3.043,2.08,7.545-0.962,10.056\n\t\t\t\t\t\tc-3.043,2.511-15.361,3.416-15.361,3.416S127.79,222.418,130.832,219.907z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M124.565,234.341c0,0,0.037-0.003,0.093-0.007c0.984-2.189,5.121-11.098,8.075-12.887\n\t\t\t\t\t\tc3.213-1.946,7.344-1.057,9.497,1.945c-0.264-0.897-0.709-1.756-1.342-2.522c-2.511-3.043-7.013-3.473-10.056-0.962\n\t\t\t\t\t\tC127.79,222.418,124.565,234.341,124.565,234.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree_2_\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M146.93,210.747h-4.233l0.025,6.878c-0.001,0.015-0.006,0.03-0.006,0.045c0,0.92,0.919,1.665,2.052,1.665\n\t\t\t\t\t\ts2.052-0.746,2.052-1.665C146.821,217.53,146.93,210.747,146.93,210.747z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M145.342,210.747l-0.176,8.556c0.943-0.15,1.656-0.823,1.656-1.633c0-0.141,0.108-6.923,0.108-6.923\n\t\t\t\t\t\tH145.342z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M152.309,206.382c0,3.945-3.198,7.143-7.143,7.143c-3.945,0-7.143-3.198-7.143-7.143\n\t\t\t\t\t\ts7.143-14.021,7.143-14.021S152.309,202.437,152.309,206.382z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M145.166,192.361c0,0-0.022,0.031-0.054,0.076c1.062,2.153,5.3,11.013,4.799,14.431\n\t\t\t\t\t\tc-0.544,3.717-3.86,6.337-7.545,6.086c0.86,0.367,1.806,0.571,2.8,0.571c3.945,0,7.143-3.198,7.143-7.143\n\t\t\t\t\t\tC152.309,202.437,145.166,192.361,145.166,192.361z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M155.331,243.566l4.078,4.942l8.006-6.657c0.018-0.014,0.04-0.022,0.058-0.037\n\t\t\t\t\t\tc1.074-0.886,1.059-2.677-0.034-4.001c-1.092-1.323-2.848-1.678-3.922-0.792C163.354,237.157,155.331,243.566,155.331,243.566z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M156.86,245.419l10.159-8.038c-1.084-0.957-2.556-1.139-3.501-0.36c-0.164,0.135-8.187,6.545-8.187,6.545\n\t\t\t\t\t\tL156.86,245.419z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M145.052,241.492c4.606-3.801,11.42-3.149,15.221,1.457c3.801,4.606,3.149,11.42-1.457,15.221\n\t\t\t\t\t\tc-4.606,3.801-23.252,5.171-23.252,5.171S140.446,245.293,145.052,241.492z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M135.565,263.341c0,0,0.056-0.004,0.141-0.011c1.489-3.314,7.751-16.799,12.223-19.508\n\t\t\t\t\t\tc4.863-2.946,11.117-1.6,14.376,2.944c-0.4-1.357-1.074-2.658-2.031-3.818c-3.801-4.606-10.616-5.258-15.221-1.457\n\t\t\t\t\t\tC140.446,245.293,135.565,263.341,135.565,263.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree_3_\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M169.418,227.627h-6.407l0.039,10.412c-0.001,0.023-0.008,0.045-0.008,0.068\n\t\t\t\t\t\tc0,1.392,1.391,2.521,3.107,2.521s3.107-1.129,3.107-2.521C169.255,237.895,169.418,227.627,169.418,227.627z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M167.015,227.627l-0.267,12.951c1.428-0.227,2.506-1.246,2.506-2.471c0-0.213,0.164-10.48,0.164-10.48\n\t\t\t\t\t\tH167.015z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M177.561,221.02c0,5.971-4.841,10.812-10.812,10.812c-5.971,0-10.812-4.841-10.812-10.812\n\t\t\t\t\t\ts10.812-21.224,10.812-21.224S177.561,215.049,177.561,221.02z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M166.749,199.796c0,0-0.033,0.046-0.081,0.116c1.608,3.258,8.022,16.671,7.265,21.844\n\t\t\t\t\t\tc-0.823,5.626-5.842,9.592-11.421,9.213c1.302,0.555,2.733,0.864,4.238,0.864c5.971,0,10.812-4.841,10.812-10.812\n\t\t\t\t\t\tC177.561,215.048,166.749,199.796,166.749,199.796z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M108.244,247.65l5.092,6.17l9.996-8.312c0.023-0.018,0.05-0.027,0.072-0.046\n\t\t\t\t\t\tc1.341-1.106,1.322-3.343-0.042-4.995s-3.556-2.095-4.896-0.988C118.261,239.648,108.244,247.65,108.244,247.65z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M110.154,249.964l12.684-10.036c-1.354-1.194-3.192-1.423-4.372-0.449\n\t\t\t\t\t\tc-0.205,0.169-10.222,8.171-10.222,8.171L110.154,249.964z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M95.41,245.061c5.75-4.746,14.259-3.932,19.005,1.819c4.746,5.75,3.932,14.259-1.819,19.005\n\t\t\t\t\t\tc-5.75,4.746-29.031,6.456-29.031,6.456S89.66,249.807,95.41,245.061z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M83.565,272.341c0,0,0.07-0.005,0.176-0.014c1.86-4.138,9.678-20.974,15.262-24.357\n\t\t\t\t\t\tc6.072-3.679,13.88-1.998,17.949,3.676c-0.5-1.695-1.341-3.319-2.536-4.767c-4.746-5.75-13.255-6.565-19.005-1.819\n\t\t\t\t\t\tC89.66,249.807,83.565,272.341,83.565,272.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M125.833,227.75h-8l0.048,13c-0.001,0.029-0.011,0.056-0.011,0.085c0,1.738,1.737,3.147,3.879,3.147\n\t\t\t\t\t\ts3.879-1.409,3.879-3.147C125.629,240.569,125.833,227.75,125.833,227.75z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M122.833,227.75l-0.333,16.171c1.783-0.284,3.129-1.556,3.129-3.086c0-0.266,0.204-13.085,0.204-13.085\n\t\t\t\t\t\tH122.833z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M136,219.5c0,7.456-6.044,13.5-13.5,13.5s-13.5-6.044-13.5-13.5s13.5-26.5,13.5-26.5\n\t\t\t\t\t\tS136,212.044,136,219.5z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M122.5,193c0,0-0.041,0.058-0.101,0.144c2.008,4.068,10.016,20.815,9.071,27.274\n\t\t\t\t\t\tc-1.028,7.025-7.295,11.977-14.26,11.503c1.625,0.693,3.413,1.078,5.291,1.078c7.456,0,13.5-6.044,13.5-13.5\n\t\t\t\t\t\tC136,212.044,122.5,193,122.5,193z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M107.995,488.935c0,0-27.495,15.065-38.495-8.435s14.505-35.435,14.505-35.435l-0.12,0.066\n\t\t\t\t\tc8.25-4.635,21.086-15.728,22.441-24.818c0.706-4.742-2.117-10.473-8.392-17.033c-29.661-31.009-40.896-58.425-34.35-83.813\n\t\t\t\t\tc5.938-23.025,25.774-39.959,58.958-50.329c29.623-9.256,55.577-6.308,79.346,9.018c19.332,12.465,34.375,31.005,51.794,52.473\n\t\t\t\t\tc5.819,7.172,11.837,14.588,18.272,22.071c19.028,22.127,42.605,34.183,61.514,31.455c13.414-1.932,24.096-11.502,31.747-28.444\n\t\t\t\t\tc9.5-21.035-10.042-41.312-19.434-51.055c-23.146-24.015-60.765-49.642-100.592-76.773c-11.578-7.887-23.55-16.042-35.499-24.381\n\t\t\t\t\tc-70.021-48.869-47.963-94.971-39.535-107.937c24.343-37.448,86.145-51.298,124.771-27.962\n\t\t\t\t\tc48.298,29.18,80.323,52.135,81.663,53.098c11.212,8.058,13.768,23.68,5.71,34.891c-8.059,11.21-23.676,13.767-34.889,5.712l0,0\n\t\t\t\t\tc-0.312-0.225-31.873-22.831-78.34-50.905c-14.191-8.572-46.646-3.502-56.994,12.417c-2.279,3.506-2.561,6.683-0.974,10.966\n\t\t\t\t\tc1.817,4.903,7.769,15.154,27.204,28.718c11.716,8.177,23.57,16.252,35.033,24.061c42.021,28.626,81.712,55.665,108.441,83.397\n\t\t\t\t\tc15.897,16.493,26.271,32.227,31.712,48.098c6.755,19.703,5.844,39.296-2.71,58.235c-14.717,32.586-39.643,52.955-70.188,57.354\n\t\t\t\t\tc-4.11,0.592-8.272,0.884-12.457,0.884c-32.675,0.002-67.042-17.771-94.094-49.228c-6.902-8.025-13.149-15.725-19.19-23.17\n\t\t\t\t\tc-33.405-41.169-46.527-54.919-77.399-45.269c-18.515,5.786-24.713,12.207-25.456,15.09c-1.033,4.008,2.451,16.261,22.065,36.768\n\t\t\t\t\tc21.94,22.938,23.89,44.913,21.661,59.309C150.006,464.983,112.278,486.592,107.995,488.935z\"/>\n\t\t\t</g>\n\t\t\t<polygon fill=\"#8FA268\" points=\"444.031,82.921 421.206,70.034 376.024,118.763 398.849,131.65 \t\"/>\n\t\t\t<ellipse fill=\"#425353\" cx=\"431.75\" cy=\"81.25\" rx=\"39.75\" ry=\"32.25\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#A46340\" d=\"M114.994,480.935c0,0-29.994,15.565-38.994-9.935s15.006-33.935,15.006-33.935l-0.122,0.065\n\t\t\t\t\tc8.25-4.634,21.087-15.728,22.441-24.818c0.706-4.74-2.116-10.472-8.391-17.031c-29.663-31.01-40.897-58.425-34.35-83.815\n\t\t\t\t\tc5.938-23.025,25.775-39.956,58.959-50.328c29.623-9.255,55.578-6.306,79.344,9.019c19.334,12.463,34.375,31.003,51.794,52.472\n\t\t\t\t\tc5.821,7.172,11.837,14.588,18.271,22.072c19.032,22.125,42.604,34.183,61.516,31.456c13.416-1.935,24.097-11.503,31.747-28.447\n\t\t\t\t\tc3.084-6.828,9.5-21.034-19.435-51.053c-23.146-24.016-60.763-49.644-100.591-76.775c-11.578-7.884-23.55-16.041-35.5-24.381\n\t\t\t\t\tc-70.019-48.869-47.962-94.972-39.534-107.938c24.345-37.447,86.149-51.296,124.771-27.959\n\t\t\t\t\tc48.297,29.178,80.322,52.134,81.663,53.097c11.212,8.059,13.769,23.678,5.709,34.891c-8.059,11.21-23.673,13.767-34.887,5.712\n\t\t\t\t\tl-0.001,0c-0.312-0.225-31.871-22.832-78.34-50.906c-16.629-10.045-48.164-1.173-56.994,12.418\n\t\t\t\t\tc-2.278,3.506-2.562,6.682-0.975,10.966c1.819,4.903,7.769,15.153,27.207,28.719c11.716,8.175,23.568,16.25,35.031,24.06\n\t\t\t\t\tc42.021,28.625,81.712,55.666,108.44,83.396c15.896,16.494,26.271,32.229,31.713,48.101c6.756,19.699,5.844,39.293-2.71,58.234\n\t\t\t\t\tc-14.716,32.584-39.644,52.953-70.188,57.353c-36.207,5.218-76.034-12.859-106.55-48.344c-6.903-8.024-13.15-15.725-19.19-23.169\n\t\t\t\t\tc-33.406-41.168-46.527-54.915-77.4-45.269c-18.516,5.784-24.712,12.206-25.456,15.091c-1.031,4.006,2.453,16.26,22.065,36.766\n\t\t\t\t\tc21.941,22.938,23.891,44.912,21.663,59.31C157.006,456.984,119.278,478.591,114.994,480.935z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<polygon fill=\"#F8F1E5\" points=\"417.514,47.235 402.848,38.955 414.939,27.215 429.606,35.495 \t\t\"/>\n\t\t\t\t<polygon fill=\"#DBD6CA\" points=\"417.514,47.235 417.626,76.223 429.718,64.483 429.606,35.495 \t\t\"/>\n\t\t\t\t<polygon fill=\"#A7AFA4\" points=\"417.835,75.829 403.169,67.548 403.052,39.102 417.719,47.382 \t\t\"/>\n\t\t\t</g>\n\t\t\t<defs>\n\t\t\t\t<filter id=\"Adobe_OpacityMaskFilter\" filterUnits=\"userSpaceOnUse\" x=\"68.781\" y=\"48.158\" width=\"356.179\" height=\"437.532\">\n\t\t\t\t\t<feColorMatrix  type=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0\"/>\n\t\t\t\t</filter>\n\t\t\t</defs>\n\t\t\t<mask maskUnits=\"userSpaceOnUse\" x=\"68.781\" y=\"48.158\" width=\"356.179\" height=\"437.532\" id=\"SVGID_1_\">\n\t\t\t\t<g filter=\"url(#Adobe_OpacityMaskFilter)\">\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"369.002,174.823 349.888,155.712 327.395,140.715 330.333,127 360.675,90.792 388.113,109.084 \n\t\t\t\t\t\t\t\t411.425,132.396 \t\t\t\t\t\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<path fill=\"#FFFFFF\" d=\"M338,434.397l-2-17.731l-12-43.269l24.601-5.638L365,353.397L397.667,389l6.268,18.175l-25.173,12.585\n\t\t\t\t\t\t\t\tL338,434.397z M109,409.397l-8.039-11.622l-0.527-0.589l-20.069-22.296L85,361l39.965-26.248l19.513,21.686l20.695,20.695\n\t\t\t\t\t\t\t\tL109,409.397z M272.573,415.756l-20.044-20.047l-22.137-17.711L236,360.647l31.873-29.499l24.738,19.792L306,363.397\n\t\t\t\t\t\t\t\tl-28.5,34.75L272.573,415.756z M371,333.397l-17-32l2.5-11.064l49.908-22.089l26.842,53.685L371,333.397z M204,338.397\n\t\t\t\t\t\t\t\tl-17.119-16.618l-0.7-0.639L171,310.397l2-12.731l31.342-41.103l21.523,19.565l22.677,18.143L207,326L204,338.397z\n\t\t\t\t\t\t\t\t M124,327.397l-8.667-11.064l-43.102-28.743l26.289-19.116l29.05-14.526L154,296.667l0.404,10.951l-24.617,12.307L124,327.397z\n\t\t\t\t\t\t\t\t M331.55,280.052l-26.058-17.373l-1.019-0.812l-23.424-18.742l1.95-11.958l35.531-34.896l22.426,17.942l23.878,15.916\n\t\t\t\t\t\t\t\tL333,268.333L331.55,280.052z M252.135,222.594l-27.238-15.888L202,192.397l4.167-14.731L241,144.397l16.76,12.017\n\t\t\t\t\t\t\t\tl24.605,14.354L253.5,210.833L252.135,222.594z M224,131.397l-53.333,0.103L163,142.397l7.215-53.596l0.489-0.834L177,67.397\n\t\t\t\t\t\t\t\tl52.833,27.769l-1.833,13.5l-5.011,8.749L224,131.397z M298.7,118.625L258,102.397l1-14.064l12.851-50.216l53.665,26.831\n\t\t\t\t\t\t\t\tL299.667,107L298.7,118.625z\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"94.679,500 61.398,450.077 89.706,431.204 101,423.397 137,454.333 142,469.397 \n\t\t\t\t\t\t\t\t116.301,485.584 \t\t\t\t\t\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t</mask>\n\t\t\t<g mask=\"url(#SVGID_1_)\">\n\t\t\t\t<path fill=\"#C1BF80\" d=\"M114.995,480.935c0,0-27.495,15.065-38.495-8.435s14.505-35.435,14.505-35.435l-0.12,0.066\n\t\t\t\t\tc8.25-4.635,21.086-15.728,22.441-24.818c0.706-4.742-2.117-10.473-8.392-17.033c-29.661-31.009-40.896-58.425-34.35-83.813\n\t\t\t\t\tc5.938-23.025,25.774-39.959,58.958-50.329c29.623-9.256,55.577-6.308,79.346,9.018c19.332,12.465,34.375,31.005,51.794,52.473\n\t\t\t\t\tc5.819,7.172,11.837,14.588,18.272,22.071c19.028,22.127,42.605,34.183,61.514,31.455c13.414-1.932,24.096-11.502,31.747-28.444\n\t\t\t\t\tc9.5-21.035-10.042-41.312-19.434-51.055c-23.146-24.015-60.765-49.642-100.592-76.773c-11.578-7.887-23.55-16.042-35.499-24.381\n\t\t\t\t\tc-70.021-48.869-47.963-94.971-39.535-107.937c24.343-37.448,86.145-51.298,124.771-27.962\n\t\t\t\t\tc48.298,29.18,80.323,52.135,81.663,53.098c11.212,8.058,13.768,23.68,5.71,34.891c-8.059,11.21-23.676,13.767-34.889,5.712l0,0\n\t\t\t\t\tc-0.312-0.225-31.873-22.831-78.34-50.905c-14.191-8.572-46.646-3.502-56.994,12.417c-2.279,3.506-2.561,6.683-0.974,10.966\n\t\t\t\t\tc1.817,4.903,7.769,15.154,27.204,28.718c11.716,8.177,23.57,16.252,35.033,24.061c42.021,28.626,81.712,55.665,108.441,83.397\n\t\t\t\t\tc15.897,16.493,26.271,32.227,31.712,48.098c6.755,19.703,5.844,39.296-2.71,58.235c-14.717,32.586-39.643,52.955-70.188,57.354\n\t\t\t\t\tc-4.11,0.592-8.272,0.884-12.457,0.884c-32.675,0.002-67.042-17.771-94.094-49.228c-6.902-8.025-13.149-15.725-19.19-23.17\n\t\t\t\t\tc-33.405-41.169-46.527-54.919-77.399-45.269c-18.515,5.786-24.713,12.207-25.456,15.09c-1.033,4.008,2.451,16.261,22.065,36.768\n\t\t\t\t\tc21.94,22.938,23.89,44.913,21.661,59.309C157.006,456.983,119.278,478.592,114.995,480.935z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#D88254\" d=\"M114.994,470.935c0,0-29.994,15.565-38.994-9.935s15.006-33.935,15.006-33.935l-0.122,0.065\n\t\t\t\t\t\tc8.25-4.634,21.087-15.728,22.441-24.818c0.706-4.74-2.116-10.472-8.391-17.031c-29.663-31.01-40.897-58.425-34.35-83.815\n\t\t\t\t\t\tc5.938-23.025,25.775-39.956,58.959-50.328c29.623-9.255,55.578-6.306,79.344,9.019c19.334,12.463,34.375,31.003,51.794,52.472\n\t\t\t\t\t\tc5.821,7.172,11.837,14.588,18.271,22.072c19.032,22.125,42.604,34.183,61.516,31.456c13.416-1.935,24.097-11.503,31.747-28.447\n\t\t\t\t\t\tc3.084-6.828,9.5-21.034-19.435-51.053c-23.146-24.016-60.763-49.644-100.591-76.775c-11.578-7.884-23.55-16.041-35.5-24.381\n\t\t\t\t\t\tc-70.019-48.869-47.962-94.972-39.534-107.938c24.345-37.447,86.149-51.296,124.771-27.959\n\t\t\t\t\t\tc48.297,29.178,80.322,52.134,81.663,53.097c11.212,8.059,13.769,23.678,5.709,34.891c-8.059,11.21-23.673,13.767-34.887,5.712\n\t\t\t\t\t\tl-0.001,0c-0.312-0.225-31.871-22.832-78.34-50.906c-16.629-10.045-48.164-1.173-56.994,12.418\n\t\t\t\t\t\tc-2.278,3.506-2.562,6.682-0.975,10.966c1.819,4.903,7.769,15.153,27.207,28.719c11.716,8.175,23.568,16.25,35.031,24.06\n\t\t\t\t\t\tc42.021,28.625,81.712,55.666,108.44,83.396c15.896,16.494,26.271,32.229,31.713,48.101c6.756,19.699,5.844,39.293-2.71,58.234\n\t\t\t\t\t\tc-14.716,32.584-39.644,52.953-70.188,57.353c-36.207,5.218-76.034-12.859-106.55-48.344c-6.903-8.024-13.15-15.725-19.19-23.169\n\t\t\t\t\t\tc-33.406-41.168-46.527-54.915-77.4-45.269c-18.516,5.784-24.712,12.206-25.456,15.091c-1.031,4.006,2.453,16.26,22.065,36.766\n\t\t\t\t\t\tc21.941,22.938,23.891,44.912,21.663,59.31C157.006,446.984,119.278,468.591,114.994,470.935z\"/>\n\t\t\t\t</g>\n\t\t\t\t<defs>\n\t\t\t\t\t<filter id=\"Adobe_OpacityMaskFilter_1_\" filterUnits=\"userSpaceOnUse\" x=\"68.781\" y=\"38.158\" width=\"356.179\" height=\"437.525\">\n\t\t\t\t\t\t<feColorMatrix  type=\"matrix\" values=\"1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0\"/>\n\t\t\t\t\t</filter>\n\t\t\t\t</defs>\n\t\t\t\t<mask maskUnits=\"userSpaceOnUse\" x=\"68.781\" y=\"38.158\" width=\"356.179\" height=\"437.525\" id=\"SVGID_2_\">\n\t\t\t\t\t<g filter=\"url(#Adobe_OpacityMaskFilter_1_)\">\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"369.002,165.425 349.888,146.314 327.395,131.318 360.675,81.395 388.113,99.687 \n\t\t\t\t\t\t\t\t\t411.425,122.999 \t\t\t\t\t\t\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<path fill=\"#FFFFFF\" d=\"M338,425l-14-61l24.601-5.638L365,344l38.935,53.777l-25.173,12.585L338,425z M109,400l-8.039-11.622\n\t\t\t\t\t\t\t\t\tl-0.527-0.589l-20.069-22.296l44.6-40.139l19.513,21.686l20.695,20.695L109,400z M272.573,406.358l-20.044-20.047\n\t\t\t\t\t\t\t\t\tl-22.137-17.711l37.48-46.85l24.738,19.792L306,354L272.573,406.358z M371,324l-17-32l52.408-33.153l26.842,53.685L371,324z\n\t\t\t\t\t\t\t\t\t M204,329l-17.119-16.618l-0.7-0.639L171,301l33.342-53.834l21.523,19.565l22.677,18.143L204,329z M124,318l-51.769-39.807\n\t\t\t\t\t\t\t\t\tl26.289-19.116l29.05-14.526l26.834,53.669l-24.617,12.307L124,318z M331.55,270.654l-26.058-17.373l-1.019-0.812\n\t\t\t\t\t\t\t\t\tl-23.424-18.742l37.481-46.854l22.426,17.942l23.878,15.916L331.55,270.654z M252.135,213.197l-27.238-15.888L202,183l39-48\n\t\t\t\t\t\t\t\t\tl16.76,12.017l24.605,14.354L252.135,213.197z M224,122l-61,11l7.215-53.596l0.489-0.834L177,58l57,40l-11.011,10.019L224,122\n\t\t\t\t\t\t\t\t\tz M298.7,109.228L258,93l13.851-64.28l53.665,26.831L298.7,109.228z\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"94.679,490.603 61.398,440.68 89.706,421.807 101,414 142,460 116.301,476.187 \t\t\t\t\t\t\"/>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</mask>\n\t\t\t\t<g mask=\"url(#SVGID_2_)\">\n\t\t\t\t\t<path fill=\"#F4F2A3\" d=\"M114.995,470.935c0,0-27.995,15.399-38.662-9.268C65.667,437,91.005,427.065,91.005,427.065l-0.12,0.066\n\t\t\t\t\t\tc8.25-4.635,21.086-15.728,22.441-24.818c0.706-4.742-2.117-10.473-8.392-17.033c-29.661-31.009-40.896-58.425-34.35-83.813\n\t\t\t\t\t\tc5.938-23.025,25.774-39.959,58.958-50.329c29.623-9.256,55.577-6.308,79.346,9.018c19.332,12.465,34.375,31.005,51.794,52.473\n\t\t\t\t\t\tc5.819,7.172,11.837,14.588,18.272,22.071c19.028,22.127,42.605,34.183,61.514,31.455c13.414-1.932,24.096-11.502,31.747-28.444\n\t\t\t\t\t\tc9.5-21.035-10.042-41.312-19.434-51.055c-23.146-24.015-60.765-49.642-100.592-76.773c-11.578-7.887-23.55-16.042-35.499-24.381\n\t\t\t\t\t\tc-70.021-48.869-47.963-94.971-39.535-107.937c24.343-37.448,86.145-51.298,124.771-27.962\n\t\t\t\t\t\tc48.298,29.18,80.323,52.135,81.663,53.098c11.212,8.058,13.768,23.68,5.71,34.891c-8.059,11.21-23.676,13.767-34.889,5.712l0,0\n\t\t\t\t\t\tc-0.312-0.225-31.873-22.831-78.34-50.905c-14.191-8.572-46.646-3.502-56.994,12.417c-2.279,3.506-2.561,6.683-0.974,10.966\n\t\t\t\t\t\tc1.817,4.903,7.769,15.154,27.204,28.718c11.716,8.177,23.57,16.252,35.033,24.061c42.021,28.626,81.712,55.665,108.441,83.397\n\t\t\t\t\t\tc15.897,16.493,26.271,32.227,31.712,48.098c6.755,19.703,5.844,39.296-2.71,58.235c-14.717,32.586-39.643,52.955-70.188,57.354\n\t\t\t\t\t\tc-4.11,0.592-8.272,0.884-12.457,0.884c-32.675,0.002-67.042-17.771-94.094-49.228c-6.902-8.025-13.149-15.725-19.19-23.17\n\t\t\t\t\t\tc-33.405-41.169-46.527-54.919-77.399-45.269c-18.515,5.786-24.713,12.207-25.456,15.09c-1.033,4.008,2.451,16.261,22.065,36.768\n\t\t\t\t\t\tc21.94,22.938,23.89,44.913,21.661,59.309C157.006,446.983,119.278,468.592,114.995,470.935z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g id=\"dots\">\n\t\t\t\t<ellipse fill=\"#50728C\" cx=\"366.75\" cy=\"120\" rx=\"12.75\" ry=\"11.5\"/>\n\t\t\t\t<ellipse fill=\"#BADA8B\" cx=\"164.25\" cy=\"270.25\" rx=\"12.25\" ry=\"11.75\"/>\n\t\t\t\t<ellipse fill=\"#7970B3\" cx=\"362.75\" cy=\"261.25\" rx=\"12.25\" ry=\"11.25\"/>\n\t\t\t\t<ellipse fill=\"#42B19D\" cx=\"390.75\" cy=\"295.5\" rx=\"14.75\" ry=\"12.5\"/>\n\t\t\t\t<ellipse fill=\"#DA813E\" cx=\"120\" cy=\"363.5\" rx=\"13.545\" ry=\"13.122\"/>\n\t\t\t\t<ellipse fill=\"#42B19D\" cx=\"119\" cy=\"281.5\" rx=\"12.928\" ry=\"12.524\"/>\n\t\t\t\t<ellipse transform=\"matrix(0.9297 0.3683 -0.3683 0.9297 120.9971 -56.4044)\" fill=\"#50728C\" cx=\"208.25\" cy=\"288.75\" rx=\"13.608\" ry=\"12.715\"/>\n\t\t\t\t<ellipse transform=\"matrix(0.7964 0.6048 -0.6048 0.7964 272.4656 -91.1952)\" fill=\"#EBC755\" cx=\"271.674\" cy=\"359.063\" rx=\"15.027\" ry=\"13.5\"/>\n\t\t\t\t<ellipse fill=\"#DA813E\" cx=\"358.5\" cy=\"385.75\" rx=\"14.5\" ry=\"13.25\"/>\n\t\t\t\t<circle fill=\"#7970B3\" cx=\"138\" cy=\"413\" r=\"13\"/>\n\t\t\t\t<ellipse fill=\"#E2584C\" cx=\"93.5\" cy=\"322.5\" rx=\"13\" ry=\"12\"/>\n\t\t\t\t<ellipse fill=\"#7970B3\" cx=\"240.5\" cy=\"324\" rx=\"11.5\" ry=\"12\"/>\n\t\t\t\t<ellipse fill=\"#E2584C\" cx=\"308\" cy=\"388.5\" rx=\"13\" ry=\"11.5\"/>\n\t\t\t\t<ellipse fill=\"#BADA8B\" cx=\"397.75\" cy=\"343.25\" rx=\"13.25\" ry=\"11.75\"/>\n\t\t\t\t<ellipse fill=\"#E2584C\" cx=\"283.25\" cy=\"199.5\" rx=\"12.25\" ry=\"11.5\"/>\n\t\t\t\t<ellipse fill=\"#50728C\" cx=\"325.25\" cy=\"230.25\" rx=\"12.25\" ry=\"11.25\"/>\n\t\t\t\t<circle fill=\"#EBC755\" cx=\"244\" cy=\"175\" r=\"13\"/>\n\t\t\t\t<ellipse fill=\"#BADA8B\" cx=\"205.75\" cy=\"144.75\" rx=\"12.25\" ry=\"11.25\"/>\n\t\t\t\t<ellipse fill=\"#DA813E\" cx=\"195.25\" cy=\"100.5\" rx=\"13.25\" ry=\"12\"/>\n\t\t\t\t<ellipse fill=\"#7970B3\" cx=\"234.25\" cy=\"69\" rx=\"14.25\" ry=\"12\"/>\n\t\t\t\t<ellipse fill=\"#42B19D\" cx=\"289.75\" cy=\"72.75\" rx=\"13.25\" ry=\"11.75\"/>\n\t\t\t\t<ellipse fill=\"#E2584C\" cx=\"329\" cy=\"94.5\" rx=\"12\" ry=\"10.75\"/>\n\t\t\t\t<ellipse fill=\"#EBC755\" cx=\"102.25\" cy=\"450\" rx=\"13.25\" ry=\"11.5\"/>\n\t\t\t</g>\n\t\t\t<g id=\"tree_6_\" class=\"tree\">\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M158.833,312.75h-8l0.048,13c-0.001,0.029-0.011,0.056-0.011,0.085c0,1.738,1.737,3.147,3.879,3.147\n\t\t\t\t\t\ts3.879-1.409,3.879-3.147C158.629,325.569,158.833,312.75,158.833,312.75z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M155.833,312.75l-0.333,16.171c1.783-0.284,3.129-1.556,3.129-3.086c0-0.266,0.204-13.085,0.204-13.085\n\t\t\t\t\t\tH155.833z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M169,304.5c0,7.456-6.044,13.5-13.5,13.5s-13.5-6.044-13.5-13.5s13.5-26.5,13.5-26.5\n\t\t\t\t\t\tS169,297.044,169,304.5z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M155.5,278c0,0-0.041,0.058-0.101,0.144c2.008,4.068,10.016,20.815,9.071,27.274\n\t\t\t\t\t\tc-1.028,7.025-7.295,11.977-14.26,11.503c1.625,0.693,3.413,1.078,5.291,1.078c7.456,0,13.5-6.044,13.5-13.5\n\t\t\t\t\t\tC169,297.044,155.5,278,155.5,278z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<defs>\n\t\t\t\t\t<ellipse id=\"SVGID_3_\" cx=\"431.75\" cy=\"81.25\" rx=\"39.75\" ry=\"32.25\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_4_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_3_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<polygon clip-path=\"url(#SVGID_4_)\" fill=\"#324040\" points=\"418.781,75.171 403.456,67.284 371.524,101.763 386.849,109.65 \t\t\"/>\n\t\t\t\t<polygon clip-path=\"url(#SVGID_4_)\" fill=\"#324040\" points=\"434.031,92.921 411.206,80.034 389.024,103.763 411.849,116.65 \t\t\"/>\n\t\t\t\t<polygon clip-path=\"url(#SVGID_4_)\" fill=\"#324040\" points=\"455.281,94.171 439.956,86.284 408.024,120.763 423.349,128.65 \t\t\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M417.244,418.65l5.092,6.17l9.996-8.312c0.023-0.018,0.05-0.027,0.072-0.046\n\t\t\t\t\t\tc1.341-1.106,1.322-3.343-0.042-4.995c-1.364-1.652-3.556-2.095-4.896-0.988C427.261,410.648,417.244,418.65,417.244,418.65z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M419.154,420.964l12.684-10.036c-1.354-1.194-3.192-1.423-4.372-0.449\n\t\t\t\t\t\tc-0.205,0.169-10.222,8.171-10.222,8.171L419.154,420.964z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M404.41,416.061c5.75-4.746,14.259-3.932,19.005,1.819c4.746,5.75,3.932,14.259-1.819,19.005\n\t\t\t\t\t\tc-5.75,4.746-29.031,6.456-29.031,6.456S398.66,420.807,404.41,416.061z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M392.565,443.341c0,0,0.07-0.005,0.176-0.014c1.86-4.138,9.678-20.974,15.262-24.357\n\t\t\t\t\t\tc6.072-3.679,13.88-1.998,17.949,3.676c-0.5-1.695-1.341-3.319-2.536-4.767c-4.746-5.75-13.255-6.565-19.005-1.819\n\t\t\t\t\t\tC398.66,420.807,392.565,443.341,392.565,443.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree_4_\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M434.833,398.75h-8l0.048,13c-0.001,0.029-0.011,0.056-0.011,0.085c0,1.738,1.737,3.147,3.879,3.147\n\t\t\t\t\t\ts3.879-1.409,3.879-3.147C434.629,411.569,434.833,398.75,434.833,398.75z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M431.833,398.75l-0.333,16.171c1.783-0.284,3.129-1.556,3.129-3.086c0-0.266,0.204-13.085,0.204-13.085\n\t\t\t\t\t\tH431.833z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M445,390.5c0,7.456-6.044,13.5-13.5,13.5s-13.5-6.044-13.5-13.5s13.5-26.5,13.5-26.5\n\t\t\t\t\t\tS445,383.044,445,390.5z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M431.5,364c0,0-0.041,0.058-0.101,0.144c2.008,4.068,10.016,20.815,9.071,27.274\n\t\t\t\t\t\tc-1.028,7.025-7.295,11.977-14.26,11.503c1.625,0.693,3.413,1.078,5.291,1.078c7.456,0,13.5-6.044,13.5-13.5\n\t\t\t\t\t\tC445,383.044,431.5,364,431.5,364z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M91.623,245.277l2.694,3.265l5.289-4.398c0.012-0.009,0.026-0.015,0.038-0.024\n\t\t\t\t\t\tc0.709-0.585,0.699-1.769-0.022-2.643c-0.722-0.874-1.881-1.108-2.591-0.523C96.923,241.043,91.623,245.277,91.623,245.277z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M92.633,246.501l6.711-5.31c-0.716-0.632-1.689-0.753-2.313-0.238c-0.108,0.089-5.408,4.324-5.408,4.324\n\t\t\t\t\t\tL92.633,246.501z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M84.832,243.907c3.043-2.511,7.545-2.08,10.056,0.962c2.511,3.043,2.08,7.545-0.962,10.056\n\t\t\t\t\t\tc-3.043,2.511-15.361,3.416-15.361,3.416S81.79,246.418,84.832,243.907z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M78.565,258.341c0,0,0.037-0.003,0.093-0.007c0.984-2.19,5.121-11.098,8.075-12.887\n\t\t\t\t\t\tc3.213-1.946,7.344-1.057,9.497,1.945c-0.264-0.897-0.709-1.756-1.342-2.522c-2.511-3.043-7.013-3.473-10.056-0.962\n\t\t\t\t\t\tC81.79,246.418,78.565,258.341,78.565,258.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree_1_\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M100.93,234.747h-4.233l0.025,6.878c-0.001,0.015-0.006,0.03-0.006,0.045c0,0.92,0.919,1.665,2.052,1.665\n\t\t\t\t\t\tc1.134,0,2.052-0.746,2.052-1.665C100.821,241.53,100.93,234.747,100.93,234.747z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M99.342,234.747l-0.176,8.556c0.943-0.15,1.656-0.823,1.656-1.633c0-0.141,0.108-6.923,0.108-6.923\n\t\t\t\t\t\tH99.342z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M106.309,230.382c0,3.945-3.198,7.143-7.143,7.143c-3.945,0-7.143-3.198-7.143-7.143\n\t\t\t\t\t\ts7.143-14.021,7.143-14.021S106.309,226.437,106.309,230.382z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M99.166,216.361c0,0-0.022,0.031-0.054,0.076c1.062,2.153,5.3,11.013,4.799,14.431\n\t\t\t\t\t\tc-0.544,3.717-3.86,6.337-7.545,6.086c0.86,0.367,1.806,0.571,2.8,0.571c3.945,0,7.143-3.198,7.143-7.143\n\t\t\t\t\t\tC106.309,226.437,99.166,216.361,99.166,216.361z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M396.008,431.888l4.218,5.111l8.28-6.885c0.019-0.015,0.041-0.023,0.06-0.038\n\t\t\t\t\t\tc1.11-0.916,1.095-2.769-0.035-4.138s-2.946-1.735-4.056-0.819C404.306,425.26,396.008,431.888,396.008,431.888z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M397.59,433.805l10.507-8.313c-1.121-0.989-2.644-1.179-3.621-0.372c-0.17,0.14-8.467,6.769-8.467,6.769\n\t\t\t\t\t\tL397.59,433.805z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M385.377,429.743c4.763-3.931,11.812-3.257,15.743,1.507s3.257,11.812-1.507,15.743\n\t\t\t\t\t\tc-4.763,3.931-24.048,5.348-24.048,5.348S380.614,433.674,385.377,429.743z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M375.565,452.341c0,0,0.058-0.004,0.146-0.011c1.54-3.428,8.017-17.374,12.642-20.176\n\t\t\t\t\t\tc5.03-3.047,11.498-1.655,14.868,3.045c-0.414-1.404-1.111-2.749-2.101-3.949c-3.931-4.763-10.98-5.438-15.743-1.507\n\t\t\t\t\t\tC380.614,433.674,375.565,452.341,375.565,452.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree_5_\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M410.578,415.404h-6.627l0.04,10.769c-0.001,0.024-0.009,0.046-0.009,0.07\n\t\t\t\t\t\tc0,1.44,1.439,2.607,3.213,2.607s3.213-1.167,3.213-2.607C410.409,426.023,410.578,415.404,410.578,415.404z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M408.093,415.404l-0.276,13.395c1.477-0.235,2.592-1.289,2.592-2.556c0-0.22,0.169-10.839,0.169-10.839\n\t\t\t\t\t\tH408.093z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M419,408.57c0,6.176-5.007,11.183-11.183,11.183s-11.183-5.007-11.183-11.183\n\t\t\t\t\t\ts11.183-21.952,11.183-21.952S419,402.394,419,408.57z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M407.817,386.618c0,0-0.034,0.048-0.084,0.119c1.663,3.37,8.297,17.242,7.514,22.593\n\t\t\t\t\t\tc-0.852,5.819-6.043,9.921-11.813,9.529c1.346,0.574,2.827,0.893,4.383,0.893c6.176,0,11.183-5.007,11.183-11.183\n\t\t\t\t\t\tC419,402.393,407.817,386.618,407.817,386.618z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M345.746,442.285c2.285-1.785,5.976-0.877,8.245,2.027s2.255,6.705-0.03,8.49\n\t\t\t\t\tc-2.285,1.785-11.397,0.436-11.397,0.436S343.461,444.069,345.746,442.285z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M360.5,444.25c0,2.9-3.246,5.25-7.25,5.25s-7.25-2.35-7.25-5.25s7.25-9.25,7.25-9.25\n\t\t\t\t\tS360.5,441.35,360.5,444.25z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M353.961,435.645c0.56,1.102,4.291,8.604,3.316,11.104c-0.551,1.413-1.879,2.357-3.551,2.734\n\t\t\t\t\t\tc3.781-0.179,6.774-2.45,6.774-5.233C360.5,441.911,355.785,437.329,353.961,435.645z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M353.824,435.518c-0.351-0.322-0.574-0.518-0.574-0.518s-0.585,0.515-1.411,1.303\n\t\t\t\t\t\tC352.891,435.865,353.649,435.583,353.824,435.518z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<defs>\n\t\t\t\t\t<path id=\"SVGID_5_\" d=\"M114.995,470.935c0,0-27.995,15.399-38.662-9.268C65.667,437,91.005,427.065,91.005,427.065l-0.12,0.066\n\t\t\t\t\t\tc8.25-4.635,21.086-15.728,22.441-24.818c0.706-4.742-2.117-10.473-8.392-17.033c-29.661-31.009-40.896-58.425-34.35-83.813\n\t\t\t\t\t\tc5.938-23.025,25.774-39.959,58.958-50.329c29.623-9.256,55.577-6.308,79.346,9.018c19.332,12.465,34.375,31.005,51.794,52.473\n\t\t\t\t\t\tc5.819,7.172,11.837,14.588,18.272,22.071c19.028,22.127,42.605,34.183,61.514,31.455c13.414-1.932,24.096-11.502,31.747-28.444\n\t\t\t\t\t\tc9.5-21.035-10.042-41.312-19.434-51.055c-23.146-24.015-60.765-49.642-100.592-76.773c-11.578-7.887-23.55-16.042-35.499-24.381\n\t\t\t\t\t\tc-70.021-48.869-47.963-94.971-39.535-107.937c24.343-37.448,86.145-51.298,124.771-27.962\n\t\t\t\t\t\tc48.298,29.18,80.323,52.135,81.663,53.098c11.212,8.058,13.768,23.68,5.71,34.891c-8.059,11.21-23.676,13.767-34.889,5.712l0,0\n\t\t\t\t\t\tc-0.312-0.225-31.873-22.831-78.34-50.905c-14.191-8.572-46.646-3.502-56.994,12.417c-2.279,3.506-2.561,6.683-0.974,10.966\n\t\t\t\t\t\tc1.817,4.903,7.769,15.154,27.204,28.718c11.716,8.177,23.57,16.252,35.033,24.061c42.021,28.626,81.712,55.665,108.441,83.397\n\t\t\t\t\t\tc15.897,16.493,26.271,32.227,31.712,48.098c6.755,19.703,5.844,39.296-2.71,58.235c-14.717,32.586-39.643,52.955-70.188,57.354\n\t\t\t\t\t\tc-4.11,0.592-8.272,0.884-12.457,0.884c-32.675,0.002-67.042-17.771-94.094-49.228c-6.902-8.025-13.149-15.725-19.19-23.17\n\t\t\t\t\t\tc-33.405-41.169-46.527-54.919-77.399-45.269c-18.515,5.786-24.713,12.207-25.456,15.09c-1.033,4.008,2.451,16.261,22.065,36.768\n\t\t\t\t\t\tc21.94,22.938,23.89,44.913,21.661,59.309C157.006,446.983,119.278,468.592,114.995,470.935z\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_6_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_5_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<polygon clip-path=\"url(#SVGID_6_)\" fill=\"#C1BF80\" points=\"438.031,80.921 415.206,68.034 370.024,116.763 392.849,129.65 \t\t\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M330.006,440.356c1.521-1.188,3.977-0.584,5.487,1.349s1.501,4.462-0.02,5.65s-7.585,0.29-7.585,0.29\n\t\t\t\t\tS328.485,441.544,330.006,440.356z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M339.825,441.664c0,1.93-2.16,3.494-4.825,3.494s-4.825-1.564-4.825-3.494c0-1.93,4.825-6.156,4.825-6.156\n\t\t\t\t\tS339.825,439.735,339.825,441.664z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M335.473,435.937c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C339.825,440.107,336.687,437.059,335.473,435.937z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M335.382,435.854c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC334.761,436.084,335.265,435.896,335.382,435.854z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M191.694,235.081c1.775-1.387,4.644-0.682,6.406,1.575c1.763,2.256,1.752,5.21-0.023,6.597\n\t\t\t\t\tc-1.775,1.387-8.855,0.338-8.855,0.338S189.919,236.467,191.694,235.081z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M203.158,236.608c0,2.253-2.522,4.079-5.633,4.079c-3.111,0-5.633-1.826-5.633-4.079\n\t\t\t\t\ts5.633-7.187,5.633-7.187S203.158,234.355,203.158,236.608z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M198.078,229.921c0.435,0.856,3.334,6.685,2.576,8.628c-0.428,1.098-1.46,1.832-2.759,2.124\n\t\t\t\t\t\tc2.938-0.139,5.263-1.903,5.263-4.066C203.158,234.79,199.494,231.23,198.078,229.921z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M197.971,229.823c-0.273-0.25-0.446-0.403-0.446-0.403s-0.454,0.4-1.097,1.013\n\t\t\t\t\t\tC197.246,230.093,197.835,229.873,197.971,229.823z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M96.594,250.092c1.775-1.387,4.644-0.682,6.406,1.575c1.763,2.256,1.752,5.21-0.023,6.597\n\t\t\t\t\tc-1.775,1.387-8.855,0.338-8.855,0.338S94.818,251.479,96.594,250.092z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M108.058,251.619c0,2.253-2.522,4.079-5.633,4.079s-5.633-1.826-5.633-4.079s5.633-7.187,5.633-7.187\n\t\t\t\t\tS108.058,249.366,108.058,251.619z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M102.977,244.933c0.435,0.856,3.334,6.685,2.576,8.628c-0.428,1.098-1.46,1.832-2.759,2.124\n\t\t\t\t\t\tc2.938-0.139,5.263-1.903,5.263-4.066C108.058,249.801,104.394,246.242,102.977,244.933z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M102.871,244.835c-0.273-0.25-0.446-0.403-0.446-0.403s-0.454,0.4-1.097,1.013\n\t\t\t\t\t\tC102.146,245.104,102.735,244.885,102.871,244.835z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M166.594,328.092c1.775-1.387,4.644-0.682,6.406,1.575c1.763,2.257,1.752,5.21-0.023,6.597\n\t\t\t\t\ts-8.855,0.338-8.855,0.338S164.818,329.479,166.594,328.092z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M178.058,329.619c0,2.253-2.522,4.079-5.633,4.079s-5.633-1.826-5.633-4.079s5.633-7.187,5.633-7.187\n\t\t\t\t\tS178.058,327.366,178.058,329.619z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M172.977,322.933c0.435,0.856,3.334,6.685,2.576,8.628c-0.428,1.098-1.46,1.832-2.759,2.124\n\t\t\t\t\t\tc2.938-0.139,5.263-1.903,5.263-4.066C178.058,327.801,174.394,324.242,172.977,322.933z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M172.871,322.835c-0.273-0.25-0.446-0.403-0.446-0.403s-0.454,0.4-1.097,1.013\n\t\t\t\t\t\tC172.146,323.104,172.735,322.885,172.871,322.835z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M371.572,434.034c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S370.052,435.222,371.572,434.034z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M381.391,435.342c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494\n\t\t\t\t\tc0-1.93,4.825-6.156,4.825-6.156S381.391,433.413,381.391,435.342z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M377.04,429.615c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C381.391,433.786,378.253,430.737,377.04,429.615z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M376.949,429.532c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC376.328,429.762,376.832,429.574,376.949,429.532z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M189.671,37.275c2.285-1.785,5.976-0.877,8.245,2.027c2.268,2.904,2.255,6.705-0.03,8.49\n\t\t\t\t\ts-11.397,0.436-11.397,0.436S187.385,39.06,189.671,37.275z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M204.425,39.241c0,2.899-3.246,5.25-7.25,5.25s-7.25-2.351-7.25-5.25s7.25-9.25,7.25-9.25\n\t\t\t\t\tS204.425,36.341,204.425,39.241z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M197.886,30.636c0.56,1.102,4.291,8.604,3.316,11.104c-0.551,1.413-1.879,2.357-3.551,2.734\n\t\t\t\t\t\tc3.781-0.179,6.774-2.45,6.774-5.233C204.425,36.902,199.71,32.32,197.886,30.636z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M197.749,30.509c-0.351-0.322-0.574-0.518-0.574-0.518s-0.585,0.515-1.411,1.303\n\t\t\t\t\t\tC196.816,30.856,197.574,30.574,197.749,30.509z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M215.497,29.025c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\ts-7.585,0.29-7.585,0.29S213.977,30.213,215.497,29.025z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M225.316,30.333c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494\n\t\t\t\t\tc0-1.93,4.825-6.156,4.825-6.156S225.316,28.404,225.316,30.333z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M220.965,24.606c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C225.316,28.777,222.178,25.728,220.965,24.606z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M220.874,24.523c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC220.253,24.753,220.757,24.565,220.874,24.523z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M374.164,72.359c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S372.643,73.546,374.164,72.359z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M383.983,73.667c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494\n\t\t\t\t\tc0-1.93,4.825-6.156,4.825-6.156S383.983,71.737,383.983,73.667z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M379.632,67.94c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C383.983,72.11,380.845,69.061,379.632,67.94z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M379.54,67.856c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC378.919,68.086,379.424,67.899,379.54,67.856z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M248.847,116.985c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S247.326,118.172,248.847,116.985z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M258.666,118.293c0,1.93-2.16,3.494-4.825,3.494s-4.825-1.564-4.825-3.494c0-1.93,4.825-6.156,4.825-6.156\n\t\t\t\t\tS258.666,116.363,258.666,118.293z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M254.314,112.566c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C258.666,116.736,255.528,113.687,254.314,112.566z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M254.223,112.482c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC253.602,112.712,254.106,112.525,254.223,112.482z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M158.089,476.307c2.285-1.785,5.976-0.877,8.245,2.027s2.255,6.705-0.03,8.49\n\t\t\t\t\tc-2.285,1.785-11.397,0.436-11.397,0.436S155.804,478.092,158.089,476.307z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M172.843,478.272c0,2.899-3.246,5.25-7.25,5.25c-4.004,0-7.25-2.351-7.25-5.25c0-2.9,7.25-9.25,7.25-9.25\n\t\t\t\t\tS172.843,475.373,172.843,478.272z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M166.304,469.667c0.56,1.102,4.291,8.604,3.316,11.104c-0.551,1.413-1.879,2.357-3.551,2.734\n\t\t\t\t\t\tc3.781-0.179,6.774-2.45,6.774-5.233C172.843,475.933,168.128,471.351,166.304,469.667z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M166.167,469.541c-0.351-0.322-0.574-0.518-0.574-0.518s-0.585,0.515-1.411,1.303\n\t\t\t\t\t\tC165.234,469.887,165.992,469.605,166.167,469.541z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M142.349,474.378c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S140.828,475.566,142.349,474.378z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M152.168,475.686c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494\n\t\t\t\t\tc0-1.93,4.825-6.156,4.825-6.156S152.168,473.757,152.168,475.686z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M147.816,469.96c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C152.168,474.13,149.03,471.081,147.816,469.96z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M147.725,469.876c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC147.104,470.106,147.608,469.919,147.725,469.876z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M168.673,441.69c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S167.152,442.877,168.673,441.69z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M178.492,442.998c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494\n\t\t\t\t\tc0-1.93,4.825-6.156,4.825-6.156S178.492,441.068,178.492,442.998z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M174.14,437.271c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C178.492,441.441,175.354,438.392,174.14,437.271z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M174.049,437.187c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC173.428,437.417,173.932,437.23,174.049,437.187z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M78.18,408.985c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S76.659,410.172,78.18,408.985z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M87.999,410.293c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494s4.825-6.156,4.825-6.156\n\t\t\t\t\tS87.999,408.363,87.999,410.293z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M83.647,404.566c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C87.999,408.736,84.861,405.687,83.647,404.566z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M83.556,404.482c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC82.935,404.712,83.439,404.525,83.556,404.482z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M64.422,387.973c2.285-1.785,5.976-0.877,8.245,2.027c2.268,2.904,2.255,6.705-0.03,8.49\n\t\t\t\t\ts-11.397,0.436-11.397,0.436S62.137,389.758,64.422,387.973z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M79.176,389.939c0,2.9-3.246,5.25-7.25,5.25s-7.25-2.35-7.25-5.25s7.25-9.25,7.25-9.25\n\t\t\t\t\tS79.176,387.039,79.176,389.939z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M72.638,381.333c0.56,1.102,4.291,8.604,3.316,11.104c-0.551,1.413-1.879,2.357-3.551,2.734\n\t\t\t\t\t\tc3.781-0.179,6.774-2.45,6.774-5.233C79.176,387.599,74.461,383.018,72.638,381.333z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M72.501,381.207c-0.351-0.322-0.574-0.518-0.574-0.518s-0.585,0.515-1.411,1.303\n\t\t\t\t\t\tC71.567,381.554,72.325,381.272,72.501,381.207z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M333.027,349.747c1.775-1.387,4.644-0.682,6.406,1.575c1.763,2.257,1.752,5.21-0.023,6.597\n\t\t\t\t\ts-8.855,0.338-8.855,0.338S331.252,351.134,333.027,349.747z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M344.491,351.274c0,2.253-2.522,4.079-5.633,4.079s-5.633-1.826-5.633-4.079s5.633-7.187,5.633-7.187\n\t\t\t\t\tS344.491,349.022,344.491,351.274z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M339.411,344.588c0.435,0.856,3.334,6.685,2.576,8.628c-0.428,1.098-1.46,1.832-2.759,2.124\n\t\t\t\t\t\tc2.938-0.139,5.263-1.903,5.263-4.066C344.491,349.457,340.828,345.897,339.411,344.588z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M339.304,344.49c-0.273-0.25-0.446-0.403-0.446-0.403s-0.454,0.4-1.097,1.013\n\t\t\t\t\t\tC338.579,344.759,339.168,344.54,339.304,344.49z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M140.18,235.651c1.521-1.188,3.977-0.584,5.487,1.349c1.51,1.933,1.501,4.462-0.02,5.65\n\t\t\t\t\tc-1.521,1.188-7.585,0.29-7.585,0.29S138.659,236.839,140.18,235.651z\"/>\n\t\t\t\t<path fill=\"#2D7E66\" d=\"M149.999,236.959c0,1.93-2.16,3.494-4.825,3.494c-2.665,0-4.825-1.564-4.825-3.494\n\t\t\t\t\tc0-1.93,4.825-6.156,4.825-6.156S149.999,235.03,149.999,236.959z\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M145.647,231.232c0.373,0.733,2.856,5.726,2.207,7.39c-0.367,0.94-1.25,1.569-2.363,1.819\n\t\t\t\t\t\tc2.516-0.119,4.508-1.63,4.508-3.482C149.999,235.402,146.861,232.353,145.647,231.232z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M145.556,231.149c-0.234-0.214-0.382-0.345-0.382-0.345s-0.389,0.342-0.939,0.867\n\t\t\t\t\t\tC144.935,231.379,145.439,231.191,145.556,231.149z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\n\t\t\t\t\t<ellipse transform=\"matrix(0.4646 0.8855 -0.8855 0.4646 502.2097 -254.0585)\" fill=\"#8FA268\" cx=\"461.212\" cy=\"288.3\" rx=\"20.771\" ry=\"24.544\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"none\" d=\"M468,261c-5.767,0-11.108,1.276-15.495,3.444c5.131-1.864,11.075-2.076,16.895-0.197\n\t\t\t\t\t\tc12.964,4.185,20.39,17.132,16.585,28.917c-0.142,0.438-0.301,0.866-0.469,1.289C491.317,290.968,495,285.788,495,280\n\t\t\t\t\t\tC495,269.507,482.912,261,468,261z\"/>\n\t\t\t\t\t<path fill=\"#A9B16D\" d=\"M469.4,264.247c-5.82-1.879-11.764-1.667-16.895,0.197C445.55,267.881,441,273.565,441,280\n\t\t\t\t\t\tc0,10.493,12.088,19,27,19c6.687,0,12.801-1.714,17.516-4.547c0.168-0.423,0.327-0.851,0.469-1.289\n\t\t\t\t\t\tC489.79,281.379,482.364,268.432,469.4,264.247z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.9932 0.1167 -0.1167 0.9932 36.3685 -52.3216)\" fill=\"none\" cx=\"465.156\" cy=\"284.528\" rx=\"25.404\" ry=\"13.337\"/>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 389.4986 -114.181)\" fill=\"#8FA268\" cx=\"304.813\" cy=\"318.363\" rx=\"11.249\" ry=\"14.507\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M308.844,302.847c-2.888,0-5.563,0.639-7.76,1.725c2.57-0.934,5.547-1.04,8.461-0.099\n\t\t\t\t\tc6.493,2.096,10.212,8.58,8.307,14.483c-0.071,0.22-0.151,0.434-0.235,0.646c2.905-1.745,4.75-4.34,4.75-7.239\n\t\t\t\t\tC322.367,307.107,316.313,302.847,308.844,302.847z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M309.546,304.473c-2.915-0.941-5.892-0.835-8.461,0.099c-3.483,1.721-5.762,4.568-5.762,7.791\n\t\t\t\t\tc0,5.255,6.054,9.516,13.523,9.516c3.349,0,6.411-0.858,8.773-2.277c0.084-0.212,0.164-0.426,0.235-0.646\n\t\t\t\t\tC319.757,313.053,316.039,306.569,309.546,304.473z\"/>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 365.8505 -107.0299)\" fill=\"#8FA268\" cx=\"286.096\" cy=\"299.143\" rx=\"7.223\" ry=\"9.315\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M288.684,289.18c-1.855,0-3.572,0.41-4.983,1.108c1.65-0.599,3.561-0.668,5.433-0.063\n\t\t\t\t\tc4.169,1.346,6.557,5.509,5.334,9.299c-0.046,0.141-0.097,0.279-0.151,0.414c1.866-1.121,3.05-2.786,3.05-4.648\n\t\t\t\t\tC297.367,291.916,293.48,289.18,288.684,289.18z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M289.134,290.225c-1.872-0.604-3.783-0.536-5.433,0.063c-2.237,1.105-3.7,2.933-3.7,5.002\n\t\t\t\t\tc0,3.375,3.887,6.11,8.683,6.11c2.15,0,4.116-0.551,5.633-1.462c0.054-0.136,0.105-0.274,0.151-0.414\n\t\t\t\t\tC295.691,295.734,293.304,291.57,289.134,290.225z\"/>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 163.597 -36.67)\" fill=\"#8FA268\" cx=\"117.146\" cy=\"139.363\" rx=\"11.249\" ry=\"14.507\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M121.178,123.847c-2.888,0-5.563,0.639-7.76,1.725c2.57-0.934,5.547-1.04,8.461-0.099\n\t\t\t\t\tc6.493,2.096,10.212,8.58,8.307,14.483c-0.071,0.22-0.151,0.434-0.235,0.646c2.905-1.745,4.75-4.34,4.75-7.239\n\t\t\t\t\tC134.7,128.107,128.646,123.847,121.178,123.847z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M121.879,125.473c-2.915-0.941-5.892-0.835-8.461,0.099c-3.483,1.721-5.762,4.568-5.762,7.791\n\t\t\t\t\tc0,5.255,6.054,9.516,13.523,9.516c3.349,0,6.411-0.858,8.773-2.277c0.084-0.212,0.164-0.426,0.235-0.646\n\t\t\t\t\tC132.091,134.053,128.372,127.569,121.879,125.473z\"/>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 151.2835 16.0107)\" fill=\"#8FA268\" cx=\"60.208\" cy=\"153.834\" rx=\"15.723\" ry=\"19.612\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M65.171,132.725c-4.314,0-8.309,0.955-11.59,2.576c3.838-1.394,8.284-1.553,12.637-0.147\n\t\t\t\t\tc9.697,3.13,15.252,12.814,12.406,21.63c-0.106,0.328-0.225,0.648-0.351,0.964c4.339-2.607,7.094-6.481,7.094-10.811\n\t\t\t\t\tC85.367,139.088,76.325,132.725,65.171,132.725z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M66.218,135.154c-4.353-1.405-8.799-1.247-12.637,0.147c-5.203,2.571-8.606,6.822-8.606,11.636\n\t\t\t\t\tc0,7.849,9.042,14.212,20.196,14.212c5.002,0,9.575-1.282,13.102-3.401c0.126-0.316,0.245-0.636,0.351-0.964\n\t\t\t\t\tC81.47,147.968,75.915,138.284,66.218,135.154z\"/>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 412.3203 18.0488)\" fill=\"#8FA268\" cx=\"188.762\" cy=\"406.476\" rx=\"7.223\" ry=\"9.315\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M191.351,396.514c-1.855,0-3.572,0.41-4.983,1.108c1.65-0.599,3.561-0.668,5.433-0.063\n\t\t\t\t\tc4.169,1.346,6.557,5.509,5.334,9.299c-0.046,0.141-0.097,0.279-0.151,0.414c1.866-1.121,3.05-2.786,3.05-4.648\n\t\t\t\t\tC200.034,399.249,196.146,396.514,191.351,396.514z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M191.801,397.558c-1.872-0.604-3.783-0.536-5.433,0.063c-2.237,1.105-3.7,2.933-3.7,5.002\n\t\t\t\t\tc0,3.375,3.887,6.11,8.683,6.11c2.15,0,4.117-0.551,5.633-1.462c0.054-0.136,0.105-0.273,0.151-0.414\n\t\t\t\t\tC198.358,403.067,195.97,398.904,191.801,397.558z\"/>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 439.3286 20.6466)\" fill=\"#8FA268\" cx=\"199.762\" cy=\"433.809\" rx=\"7.223\" ry=\"9.315\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M202.351,423.847c-1.855,0-3.572,0.41-4.983,1.108c1.65-0.599,3.561-0.668,5.433-0.063\n\t\t\t\t\tc4.169,1.346,6.557,5.509,5.334,9.299c-0.046,0.141-0.097,0.279-0.151,0.414c1.866-1.121,3.05-2.786,3.05-4.648\n\t\t\t\t\tC211.034,426.583,207.146,423.847,202.351,423.847z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M202.801,424.891c-1.872-0.604-3.783-0.536-5.433,0.063c-2.237,1.105-3.7,2.933-3.7,5.002\n\t\t\t\t\tc0,3.375,3.887,6.11,8.683,6.11c2.15,0,4.117-0.551,5.633-1.462c0.054-0.136,0.105-0.274,0.151-0.414\n\t\t\t\t\tC209.358,430.4,206.97,426.237,202.801,424.891z\"/>\n\t\t\t</g>\n\n\t\t\t\t<ellipse transform=\"matrix(0.576 0.8175 -0.8175 0.576 428.5368 -0.0644)\" fill=\"#8FA268\" cx=\"214.33\" cy=\"413.051\" rx=\"6.431\" ry=\"8.294\"/>\n\t\t\t<g>\n\t\t\t\t<path fill=\"none\" d=\"M216.635,404.18c-1.651,0-3.181,0.366-4.437,0.986c1.469-0.534,3.171-0.594,4.838-0.056\n\t\t\t\t\tc3.712,1.198,5.839,4.906,4.749,8.28c-0.041,0.126-0.086,0.248-0.134,0.369c1.661-0.998,2.716-2.481,2.716-4.139\n\t\t\t\t\tC224.367,406.616,220.905,404.18,216.635,404.18z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M217.036,405.11c-1.667-0.538-3.369-0.477-4.838,0.056c-1.992,0.984-3.295,2.612-3.295,4.454\n\t\t\t\t\tc0,3.005,3.462,5.441,7.731,5.441c1.915,0,3.665-0.491,5.016-1.302c0.048-0.121,0.094-0.244,0.134-0.369\n\t\t\t\t\tC222.875,410.016,220.749,406.309,217.036,405.11z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<polygon fill=\"#F8F1E5\" points=\"433.531,48.421 410.706,35.534 429.524,17.263 452.349,30.15 \t\t\"/>\n\t\t\t\t<polygon fill=\"#DBD6CA\" points=\"433.531,48.421 433.706,93.534 452.524,75.263 452.349,30.15 \t\t\"/>\n\t\t\t\t<polygon fill=\"#A7AFA4\" points=\"434.031,93.921 411.206,80.034 411.024,35.763 433.849,48.65 \t\t\"/>\n\t\t\t\t<polygon fill=\"#55757B\" points=\"425.196,88.305 419.901,85.315 419.859,75.047 425.154,78.036 \t\t\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<polygon fill=\"#F8F1E5\" points=\"455.014,65.985 440.348,57.705 452.439,45.965 467.106,54.245 \t\t\"/>\n\t\t\t\t<polygon fill=\"#DBD6CA\" points=\"455.014,65.985 455.126,94.973 467.218,83.233 467.106,54.245 \t\t\"/>\n\t\t\t\t<polygon fill=\"#A7AFA4\" points=\"455.335,94.579 440.669,86.298 440.552,57.852 455.219,66.132 \t\t\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M381.008,190.888l4.218,5.111l8.28-6.885c0.019-0.015,0.041-0.023,0.06-0.038\n\t\t\t\t\t\tc1.11-0.916,1.095-2.769-0.035-4.138s-2.946-1.735-4.056-0.819C389.306,184.26,381.008,190.888,381.008,190.888z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M382.59,192.805l10.507-8.313c-1.121-0.989-2.644-1.179-3.621-0.372c-0.17,0.14-8.467,6.769-8.467,6.769\n\t\t\t\t\t\tL382.59,192.805z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M370.377,188.743c4.763-3.931,11.812-3.257,15.743,1.507c3.931,4.763,3.257,11.812-1.507,15.743\n\t\t\t\t\t\ts-24.048,5.348-24.048,5.348S365.614,192.674,370.377,188.743z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M360.565,211.341c0,0,0.058-0.004,0.146-0.011c1.54-3.428,8.017-17.374,12.642-20.176\n\t\t\t\t\t\tc5.03-3.047,11.498-1.655,14.868,3.045c-0.414-1.404-1.111-2.749-2.101-3.949c-3.931-4.763-10.98-5.438-15.743-1.507\n\t\t\t\t\t\tC365.614,192.674,360.565,211.341,360.565,211.341z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g id=\"tree_7_\" class=\"tree\">\n\t\t\t\t\t<path fill=\"#4D333C\" d=\"M395.578,174.404h-6.627l0.04,10.769c-0.001,0.024-0.009,0.046-0.009,0.07\n\t\t\t\t\t\tc0,1.44,1.439,2.607,3.213,2.607s3.213-1.167,3.213-2.607C395.409,185.023,395.578,174.404,395.578,174.404z\"/>\n\t\t\t\t\t<path fill=\"#61403F\" d=\"M393.093,174.404l-0.276,13.395c1.477-0.235,2.592-1.289,2.592-2.556c0-0.22,0.169-10.839,0.169-10.839\n\t\t\t\t\t\tH393.093z\"/>\n\t\t\t\t\t<path fill=\"#2D7E66\" d=\"M404,167.57c0,6.176-5.007,11.183-11.183,11.183s-11.183-5.007-11.183-11.183\n\t\t\t\t\t\ts11.183-21.952,11.183-21.952S404,161.394,404,167.57z\"/>\n\t\t\t\t\t<path fill=\"#4B9469\" d=\"M392.817,145.618c0,0-0.034,0.048-0.084,0.119c1.663,3.37,8.297,17.242,7.514,22.593\n\t\t\t\t\t\tc-0.852,5.819-6.043,9.921-11.813,9.529c1.346,0.574,2.827,0.893,4.383,0.893c6.176,0,11.183-5.007,11.183-11.183\n\t\t\t\t\t\tC404,161.394,392.817,145.618,392.817,145.618z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<defs>\n\t\t\t\t\t<polygon id=\"SVGID_7_\" points=\"438.031,80.921 415.206,68.034 370.024,116.763 392.849,129.65 \t\t\t\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_8_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_7_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<ellipse clip-path=\"url(#SVGID_8_)\" fill=\"#354C5D\" cx=\"366.75\" cy=\"120\" rx=\"12.75\" ry=\"11.5\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<polygon fill=\"#B05747\" points=\"249.837,469.412 227.012,455.525 248.242,417.698 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"249.837,469.412 227.012,455.525 209,487.667 \t\t\"/>\n\t\t\t\t<polygon fill=\"#DB7C6D\" points=\"248.083,418.083 249.914,469.368 268.732,451.097 \t\t\"/>\n\t\t\t</g>\n\t\t</g>\n\t\t<g id=\"identifier\" display=\"none\">\n\t\t\t<g display=\"inline\">\n\t\t\t\t<defs>\n\t\t\t\t\t<path id=\"SVGID_9_\" d=\"M114.994,470.935c0,0-29.994,15.565-38.994-9.935s15.006-33.935,15.006-33.935l-0.122,0.065\n\t\t\t\t\t\tc8.25-4.634,21.087-15.728,22.441-24.818c0.706-4.74-2.116-10.472-8.391-17.031c-29.663-31.01-40.897-58.425-34.35-83.815\n\t\t\t\t\t\tc5.938-23.025,25.775-39.956,58.959-50.328c29.623-9.255,55.578-6.306,79.344,9.019c19.334,12.463,34.375,31.003,51.794,52.472\n\t\t\t\t\t\tc5.821,7.172,11.837,14.588,18.271,22.072c19.032,22.125,42.604,34.183,61.516,31.456c13.416-1.935,24.097-11.503,31.747-28.447\n\t\t\t\t\t\tc3.084-6.828,9.5-21.034-19.435-51.053c-23.146-24.016-60.763-49.644-100.591-76.775c-11.578-7.884-23.55-16.041-35.5-24.381\n\t\t\t\t\t\tc-70.019-48.869-47.962-94.972-39.534-107.938c24.345-37.447,86.149-51.296,124.771-27.959\n\t\t\t\t\t\tc48.297,29.178,80.322,52.134,81.663,53.097c11.212,8.059,13.769,23.678,5.709,34.891c-8.059,11.21-23.673,13.767-34.887,5.712\n\t\t\t\t\t\tl-0.001,0c-0.312-0.225-31.871-22.832-78.34-50.906c-16.629-10.045-48.164-1.173-56.994,12.418\n\t\t\t\t\t\tc-2.278,3.506-2.562,6.682-0.975,10.966c1.819,4.903,7.769,15.153,27.207,28.719c11.716,8.175,23.568,16.25,35.031,24.06\n\t\t\t\t\t\tc42.021,28.625,81.712,55.666,108.44,83.396c15.896,16.494,26.271,32.229,31.713,48.101c6.756,19.699,5.844,39.293-2.71,58.234\n\t\t\t\t\t\tc-14.716,32.584-39.644,52.953-70.188,57.353c-36.207,5.218-76.034-12.859-106.55-48.344c-6.903-8.024-13.15-15.725-19.19-23.169\n\t\t\t\t\t\tc-33.406-41.168-46.527-54.915-77.4-45.269c-18.516,5.784-24.712,12.206-25.456,15.091c-1.031,4.006,2.453,16.26,22.065,36.766\n\t\t\t\t\t\tc21.941,22.938,23.891,44.912,21.663,59.31C157.006,446.984,119.278,468.591,114.994,470.935z\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_10_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_9_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<g clip-path=\"url(#SVGID_10_)\">\n\t\t\t\t\t<path fill=\"#DAD891\" d=\"M344.271,295.107c10.11-5.097,45.393,0.072,45.393,0.072s-16.825,31.441-26.934,36.538\n\t\t\t\t\t\ts-22.437,1.034-27.534-9.076C330.098,312.531,334.162,300.204,344.271,295.107z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<ellipse display=\"inline\" fill=\"#42B19D\" cx=\"390.75\" cy=\"295.5\" rx=\"14.75\" ry=\"12.5\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<defs>\n\t\t\t\t\t<path id=\"SVGID_11_\" d=\"M344.265,295.603c10.037-5.238,45.389-0.565,45.389-0.565s-16.382,31.674-26.419,36.912\n\t\t\t\t\t\tc-10.037,5.238-22.42,1.348-27.659-8.689C330.337,313.225,334.227,300.842,344.265,295.603z\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_12_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_11_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\n\t\t\t\t\t<ellipse transform=\"matrix(0.9979 -0.0643 0.0643 0.9979 -18.1951 25.7734)\" clip-path=\"url(#SVGID_12_)\" fill=\"#389786\" cx=\"391.006\" cy=\"295.346\" rx=\"14.75\" ry=\"12.5\"/>\n\t\t\t</g>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#70C8B9\" d=\"M410.75,254.25c0,11.322-20.5,40.5-20.5,40.5s-20.5-29.178-20.5-40.5s9.178-20.5,20.5-20.5\n\t\t\t\t\tS410.75,242.928,410.75,254.25z\"/>\n\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"390.25\" cy=\"254.75\" r=\"15\"/>\n\t\t\t</g>\n\t\t\t<path display=\"inline\" fill=\"#8FA268\" d=\"M365.713,335.974c2.386-1.168,5.218-4.011,8.081-7.523\n\t\t\t\tc-2.53-10.206-9.599-19.37-15.681-26.122c-3.331,0.225-6.185,0.726-8.059,1.643c-8.837,4.324-12.496,14.993-8.172,23.831\n\t\t\t\tC346.206,336.64,356.876,340.298,365.713,335.974z\"/>\n\t\t</g>\n\t\t<g id=\"sketch\" display=\"none\">\n\t\t\t<path display=\"inline\" fill=\"#188BAB\" d=\"M823.946,170.806c-6.605-8.232-21.542-5.521-32.959-6.957\n\t\t\t\tc-11.418-1.436-26.939-10.056-35.378-3.716c-2.134,1.603-3.037,3.934-3.214,6.705c8.416-0.058,19.13,4.946,27.591,6.011\n\t\t\t\tc11.418,1.436,26.354-1.275,32.959,6.957c6.697,8.347,11.56,23.593,10.135,34.927c-1.097,8.716-4.806,20.833-10.352,28.891\n\t\t\t\tc2.097-0.863,3.976-1.871,5.53-3.038c8.556-6.428,14.396-23.519,15.822-34.852C835.507,194.399,830.644,179.153,823.946,170.806z\"\n\t\t\t\t/>\n\t\t\t<ellipse display=\"inline\" fill=\"#B7C077\" cx=\"663.436\" cy=\"388.124\" rx=\"56.314\" ry=\"15.803\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<defs>\n\t\t\t\t\t<ellipse id=\"SVGID_13_\" cx=\"663.436\" cy=\"388.124\" rx=\"56.314\" ry=\"15.803\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_14_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_13_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<g clip-path=\"url(#SVGID_14_)\">\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M695.772,379.762c0,0,1.925,0.537,2.64,3.639c0.714,3.102-0.854,4.117-0.854,4.117l-24.749,5.698\n\t\t\t\t\t\tl-1.785-7.755L695.772,379.762z\"/>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M644.01,383.106c19.22-4.425,36.303-1.485,38.157,6.567c1.854,8.051-12.225,18.165-31.444,22.59\n\t\t\t\t\t\tc-19.22,4.425-71.843,1.188-71.843,1.188S624.79,387.531,644.01,383.106z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<path display=\"inline\" fill=\"#4D333C\" d=\"M699.686,385.252c0,0-1.693,1.756-7.337,1.756c-5.644,0-6.772-1.756-6.772-1.756v-25.397\n\t\t\t\th14.109V385.252z\"/>\n\t\t\t<path display=\"inline\" fill=\"#2D7E66\" d=\"M720.131,334.791c0,19.722-11.874,35.711-26.522,35.711\n\t\t\t\tc-14.648,0-26.522-15.988-26.522-35.711c0-19.722,26.522-70.278,26.522-70.278S720.131,315.068,720.131,334.791z\"/>\n\t\t\t<path display=\"inline\" fill=\"#4B9469\" d=\"M693.609,264.513c0,0-0.071,0.136-0.204,0.392c1.663,3.877,22.511,52.932,21.098,71.817\n\t\t\t\tc-1.315,17.578-11.867,31.472-24.523,33.445c1.187,0.219,2.398,0.334,3.629,0.334c14.648,0,26.522-15.988,26.522-35.711\n\t\t\t\tC720.131,315.068,693.609,264.513,693.609,264.513z\"/>\n\t\t\t<ellipse display=\"inline\" fill=\"#425353\" cx=\"628.244\" cy=\"125.753\" rx=\"39.75\" ry=\"32.25\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<polygon fill=\"#F8F1E5\" points=\"630.025,92.924 607.2,80.037 626.018,61.766 648.843,74.653 \t\t\"/>\n\t\t\t\t<polygon fill=\"#A7AFA4\" points=\"630.025,92.924 630.2,138.037 649.018,119.766 648.843,74.653 \t\t\"/>\n\t\t\t\t<polygon fill=\"#DBD6CA\" points=\"630.525,137.424 607.7,124.537 607.518,80.266 630.343,93.153 \t\t\"/>\n\t\t\t</g>\n\t\t\t<ellipse display=\"inline\" fill=\"#B7C077\" cx=\"644.92\" cy=\"241.126\" rx=\"56.314\" ry=\"15.803\"/>\n\t\t\t<path display=\"inline\" fill=\"#8FA268\" d=\"M651.496,177.609c19.22-4.425,36.303-1.485,38.157,6.567\n\t\t\t\tc1.854,8.051-12.225,18.165-31.444,22.59s-71.843,1.188-71.843,1.188S632.276,182.034,651.496,177.609z\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"none\" d=\"M550.225,269.333c-16.26,0-29.441,8.954-29.441,20c0,0.068,0.007,0.135,0.008,0.204\n\t\t\t\t\tc3.689-8.713,12.686-14.87,23.209-14.87c13.807,0,25,10.596,25,23.667c0,2.438-0.39,4.789-1.113,7.002\n\t\t\t\t\tc7.152-3.649,11.78-9.458,11.78-16.002C579.667,278.288,566.485,269.333,550.225,269.333z\"/>\n\t\t\t\t<path fill=\"#A9B16D\" d=\"M544,274.667c-10.522,0-19.52,6.157-23.209,14.87c0.162,10.951,13.274,19.796,29.434,19.796\n\t\t\t\t\tc6.627,0,12.741-1.488,17.662-3.998c0.723-2.213,1.113-4.564,1.113-7.002C569,285.263,557.807,274.667,544,274.667z\"/>\n\t\t\t</g>\n\t\t\t<rect x=\"194\" y=\"-95\" display=\"inline\" fill=\"#5F52A3\" width=\"63\" height=\"63\"/>\n\t\t\t<rect x=\"275\" y=\"-97\" display=\"inline\" fill=\"#BADA8B\" width=\"67\" height=\"67\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"-333\" cy=\"58\" r=\"41.006\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#BADA8B\" d=\"M-333.715,97.591c-21.926,0-39.767-17.838-39.767-39.764s17.841-39.766,39.767-39.766\n\t\t\t\t\t\t\ts39.764,17.839,39.764,39.766S-311.789,97.591-333.715,97.591z M-333.715,24.423c-18.419,0-33.405,14.985-33.405,33.403\n\t\t\t\t\t\t\tc0,18.417,14.986,33.402,33.405,33.402s33.402-14.985,33.402-33.402C-300.313,39.408-315.296,24.423-333.715,24.423z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#5F52A3\" d=\"M-333.715,100.821c-23.709,0-42.998-19.287-42.998-42.995s19.289-42.996,42.998-42.996\n\t\t\t\t\t\t\tc23.706,0,42.995,19.289,42.995,42.996S-310.009,100.821-333.715,100.821z M-333.715,21.192\n\t\t\t\t\t\t\tc-20.202,0-36.636,16.434-36.636,36.634c0,20.199,16.434,36.633,36.636,36.633c20.199,0,36.633-16.434,36.633-36.633\n\t\t\t\t\t\t\tC-297.082,37.626-313.516,21.192-333.715,21.192z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#5F52A3\" d=\"M-333.668,110.331v-3.181c1.041,0,2.072-0.033,3.097-0.098l0.199,3.175\n\t\t\t\t\t\t\tC-331.459,110.295-332.559,110.331-333.668,110.331z M-336.958,110.234c-1.106-0.067-2.203-0.168-3.284-0.303l0.391-3.156\n\t\t\t\t\t\t\tc1.019,0.126,2.047,0.221,3.085,0.284L-336.958,110.234z M-327.092,109.917l-0.398-3.156c1.031-0.129,2.053-0.29,3.06-0.483\n\t\t\t\t\t\t\tl0.596,3.125C-324.908,109.608-325.992,109.779-327.092,109.917z M-343.497,109.422c-1.087-0.205-2.159-0.443-3.221-0.713\n\t\t\t\t\t\t\tl0.789-3.082c0.994,0.255,2.004,0.477,3.023,0.669L-343.497,109.422z M-320.614,108.684l-0.789-3.082\n\t\t\t\t\t\t\tc1.003-0.258,1.994-0.545,2.97-0.865l0.988,3.026C-318.489,108.102-319.543,108.411-320.614,108.684z M-349.881,107.794\n\t\t\t\t\t\t\tc-1.053-0.339-2.091-0.711-3.11-1.112l1.168-2.959c0.957,0.377,1.932,0.725,2.917,1.045L-349.881,107.794z M-314.355,106.643\n\t\t\t\t\t\t\tl-1.168-2.957c0.96-0.381,1.904-0.791,2.833-1.23l1.361,2.877C-312.32,105.8-313.326,106.238-314.355,106.643z\n\t\t\t\t\t\t\t M-356.026,105.371c-0.997-0.469-1.976-0.968-2.942-1.494l1.528-2.793c0.904,0.495,1.827,0.966,2.768,1.407L-356.026,105.371z\n\t\t\t\t\t\t\t M-308.396,103.833l-1.535-2.787c0.901-0.497,1.789-1.024,2.659-1.578l1.709,2.684\n\t\t\t\t\t\t\tC-306.489,102.741-307.433,103.302-308.396,103.833z M-361.804,102.194c-0.929-0.59-1.839-1.208-2.728-1.853l1.864-2.575\n\t\t\t\t\t\t\tc0.839,0.607,1.693,1.188,2.566,1.741L-361.804,102.194z M-302.845,100.298l-1.87-2.572c0.836-0.609,1.653-1.243,2.448-1.9\n\t\t\t\t\t\t\tl2.025,2.451C-301.086,98.978-301.953,99.652-302.845,100.298z M-367.141,98.321c-0.848-0.701-1.674-1.427-2.476-2.179\n\t\t\t\t\t\t\tl2.175-2.321c0.752,0.705,1.528,1.389,2.327,2.046L-367.141,98.321z M-297.766,96.095l-2.181-2.314\n\t\t\t\t\t\t\tc0.752-0.71,1.485-1.44,2.193-2.193l2.317,2.178C-296.187,94.565-296.964,95.341-297.766,96.095z M-371.95,93.813\n\t\t\t\t\t\t\tc-0.752-0.798-1.479-1.62-2.181-2.465l2.442-2.038c0.665,0.795,1.348,1.57,2.057,2.322L-371.95,93.813z M-293.258,91.292\n\t\t\t\t\t\t\tl-2.448-2.032c0.659-0.794,1.292-1.609,1.901-2.445l2.572,1.87C-291.879,89.577-292.556,90.445-293.258,91.292z\n\t\t\t\t\t\t\t M-376.157,88.745c-0.646-0.884-1.264-1.789-1.861-2.715l2.678-1.721c0.559,0.873,1.14,1.726,1.749,2.56L-376.157,88.745z\n\t\t\t\t\t\t\t M-289.384,85.963l-2.678-1.715c0.556-0.868,1.081-1.757,1.578-2.662l2.79,1.535C-288.228,84.088-288.791,85.035-289.384,85.963\n\t\t\t\t\t\t\tz M-379.698,83.19c-0.528-0.957-1.028-1.932-1.5-2.923l2.87-1.37c0.447,0.935,0.916,1.855,1.414,2.759L-379.698,83.19z\n\t\t\t\t\t\t\t M-286.197,80.181l-2.877-1.358c0.438-0.93,0.851-1.879,1.233-2.844l2.957,1.171C-285.29,78.178-285.728,79.189-286.197,80.181z\n\t\t\t\t\t\t\t M-382.513,77.244c-0.41-1.019-0.783-2.053-1.128-3.102l3.026-0.988c0.32,0.983,0.674,1.952,1.053,2.909L-382.513,77.244z\n\t\t\t\t\t\t\t M-283.764,74.046l-3.026-0.988c0.32-0.975,0.609-1.966,0.864-2.968l3.082,0.786C-283.118,71.946-283.426,73.002-283.764,74.046\n\t\t\t\t\t\t\tz M-384.563,70.975c-0.27-1.056-0.513-2.128-0.724-3.209l3.125-0.609c0.199,1.019,0.422,2.029,0.68,3.026L-384.563,70.975z\n\t\t\t\t\t\t\t M-282.13,67.657l-3.125-0.596c0.193-1.008,0.351-2.027,0.482-3.057l3.156,0.398C-281.754,65.497-281.925,66.584-282.13,67.657z\n\t\t\t\t\t\t\t M-385.803,64.504c-0.137-1.084-0.242-2.178-0.314-3.281l3.175-0.202c0.065,1.034,0.165,2.063,0.295,3.082L-385.803,64.504z\n\t\t\t\t\t\t\t M-281.313,61.118l-3.175-0.196c0.062-1.022,0.096-2.055,0.096-3.096l3.181-0.2v0.2\n\t\t\t\t\t\t\tC-281.211,58.932-281.245,60.031-281.313,61.118z M-386.222,57.926v-0.099c0-1.072,0.031-2.136,0.096-3.19l3.175,0.193\n\t\t\t\t\t\t\tc-0.059,0.993-0.09,1.991-0.09,2.998L-386.222,57.926z M-284.501,54.532c-0.068-1.034-0.168-2.063-0.301-3.08l3.156-0.41\n\t\t\t\t\t\t\tc0.14,1.083,0.245,2.176,0.32,3.279L-284.501,54.532z M-382.668,51.742l-3.156-0.388c0.134-1.097,0.304-2.184,0.506-3.257\n\t\t\t\t\t\t\tl3.125,0.587C-382.382,49.692-382.541,50.711-382.668,51.742z M-285.29,48.397c-0.196-1.017-0.426-2.024-0.687-3.02l3.079-0.801\n\t\t\t\t\t\t\tc0.276,1.058,0.519,2.13,0.733,3.212L-285.29,48.397z M-381.531,45.66l-3.082-0.786c0.273-1.07,0.578-2.128,0.913-3.167\n\t\t\t\t\t\t\tl3.026,0.979C-380.99,43.662-381.276,44.655-381.531,45.66z M-286.849,42.407c-0.326-0.985-0.68-1.956-1.062-2.912l2.951-1.18\n\t\t\t\t\t\t\tc0.407,1.016,0.786,2.049,1.131,3.093L-286.849,42.407z M-379.63,39.762l-2.957-1.165c0.404-1.028,0.839-2.039,1.308-3.034\n\t\t\t\t\t\t\tl2.877,1.354C-378.841,37.85-379.251,38.799-379.63,39.762z M-289.148,36.663c-0.447-0.934-0.92-1.85-1.42-2.751l2.783-1.544\n\t\t\t\t\t\t\tc0.531,0.957,1.034,1.932,1.507,2.925L-289.148,36.663z M-376.999,34.15l-2.79-1.528c0.528-0.966,1.09-1.915,1.681-2.844\n\t\t\t\t\t\t\tl2.684,1.706C-375.976,32.353-376.501,33.243-376.999,34.15z M-292.149,31.261c-0.562-0.87-1.146-1.724-1.755-2.558l2.566-1.876\n\t\t\t\t\t\t\tc0.646,0.884,1.267,1.788,1.861,2.71L-292.149,31.261z M-373.687,28.918l-2.572-1.87c0.646-0.89,1.32-1.76,2.019-2.608\n\t\t\t\t\t\t\tl2.454,2.025C-372.447,27.264-373.078,28.081-373.687,28.918z M-295.805,26.264c-0.662-0.792-1.348-1.564-2.06-2.314\n\t\t\t\t\t\t\tl2.311-2.187c0.755,0.797,1.485,1.619,2.19,2.464L-295.805,26.264z M-369.745,24.136l-2.324-2.171\n\t\t\t\t\t\t\tc0.749-0.803,1.525-1.581,2.327-2.336l2.181,2.314C-368.313,22.651-369.04,23.382-369.745,24.136z M-300.061,21.765\n\t\t\t\t\t\t\tc-0.755-0.705-1.532-1.387-2.33-2.043l2.019-2.457c0.848,0.699,1.674,1.424,2.479,2.173L-300.061,21.765z M-365.237,19.888\n\t\t\t\t\t\t\tl-2.038-2.445c0.845-0.702,1.712-1.379,2.603-2.029l1.87,2.572C-363.637,18.595-364.448,19.229-365.237,19.888z\n\t\t\t\t\t\t\t M-304.845,17.829c-0.839-0.604-1.693-1.184-2.569-1.737l1.696-2.69c0.932,0.587,1.842,1.204,2.731,1.845L-304.845,17.829z\n\t\t\t\t\t\t\t M-360.245,16.233l-1.715-2.678c0.923-0.592,1.867-1.154,2.83-1.687l1.541,2.783C-358.49,15.15-359.378,15.678-360.245,16.233z\n\t\t\t\t\t\t\t M-310.08,14.519c-0.907-0.494-1.827-0.961-2.768-1.403l1.348-2.88c0.997,0.466,1.979,0.965,2.942,1.49L-310.08,14.519z\n\t\t\t\t\t\t\t M-354.836,13.236l-1.361-2.874c0.988-0.469,1.994-0.909,3.016-1.317L-352,12C-352.96,12.384-353.904,12.795-354.836,13.236z\n\t\t\t\t\t\t\t M-315.7,11.894c-0.96-0.376-1.935-0.724-2.923-1.041l0.975-3.029c1.05,0.339,2.088,0.708,3.11,1.109L-315.7,11.894z\n\t\t\t\t\t\t\t M-349.092,10.942l-0.988-3.023c1.041-0.342,2.094-0.651,3.159-0.927l0.802,3.079\n\t\t\t\t\t\t\tC-347.123,10.332-348.114,10.622-349.092,10.942z M-321.599,10.001c-0.994-0.253-2.001-0.474-3.023-0.663l0.584-3.128\n\t\t\t\t\t\t\tc1.084,0.202,2.159,0.438,3.222,0.707L-321.599,10.001z M-343.1,9.394l-0.603-3.125c1.075-0.207,2.162-0.381,3.256-0.52\n\t\t\t\t\t\t\tl0.404,3.156C-341.074,9.035-342.093,9.199-343.1,9.394z M-327.679,8.865c-1.016-0.124-2.047-0.217-3.085-0.28l0.186-3.175\n\t\t\t\t\t\t\tc1.106,0.065,2.199,0.165,3.284,0.295L-327.679,8.865z M-336.961,8.606l-0.205-3.175c1.087-0.07,2.187-0.107,3.293-0.11\n\t\t\t\t\t\t\tl0.006,3.181C-334.905,8.505-335.936,8.539-336.961,8.606z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<circle display=\"inline\" fill=\"#F8F1E5\" cx=\"-164.5\" cy=\"238.5\" r=\"35.5\"/>\n\t\t\t<circle display=\"inline\" fill=\"#42B19D\" cx=\"-287\" cy=\"463\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#E2584C\" cx=\"-227\" cy=\"463\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#EBC755\" cx=\"-167\" cy=\"463\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#354C5D\" cx=\"-107\" cy=\"463\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#DA813E\" cx=\"-46\" cy=\"463\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#42B19D\" cx=\"-271\" cy=\"611\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#E2584C\" cx=\"-211\" cy=\"611\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#EBC755\" cx=\"-151\" cy=\"611\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#354C5D\" cx=\"-91\" cy=\"611\" r=\"22\"/>\n\t\t\t<circle display=\"inline\" fill=\"#DA813E\" cx=\"-30\" cy=\"611\" r=\"22\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#42B19D\" d=\"M-275.667,780.333c-11.046,0-20-8.954-20-20v-86.666c0-11.046,8.954-20,20-20s20,8.954,20,20v86.666\n\t\t\t\t\tC-255.667,771.379-264.621,780.333-275.667,780.333z\"/>\n\t\t\t</g>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#354C5D\" d=\"M-89.667,780.333c-11.046,0-20-8.954-20-20v-86.666c0-11.046,8.954-20,20-20s20,8.954,20,20v86.666\n\t\t\t\t\tC-69.667,771.379-78.621,780.333-89.667,780.333z\"/>\n\t\t\t</g>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#DA813E\" d=\"M-31,780.333c-11.046,0-20-8.954-20-20v-86.666c0-11.046,8.954-20,20-20s20,8.954,20,20v86.666\n\t\t\t\t\tC-11,771.379-19.954,780.333-31,780.333z\"/>\n\t\t\t</g>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-278.667,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-278.667,669.667-278.667,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-261.333,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-261.333,669.667-261.333,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-92.667,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-92.667,669.667-92.667,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-75.333,669.667c0,0-2.537,2.5-5.667,2.5c-3.13,0-5.667-2.5-5.667-2.5\n\t\t\t\ts2.537-2.5,5.667-2.5C-77.87,667.167-75.333,669.667-75.333,669.667z\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#EBC755\" d=\"M-150.667,780.333c-11.046,0-20-8.954-20-20v-86.666c0-11.046,8.954-20,20-20s20,8.954,20,20v86.666\n\t\t\t\t\tC-130.667,771.379-139.621,780.333-150.667,780.333z\"/>\n\t\t\t</g>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-153.667,669.667c0,0-2.537,2.5-5.667,2.5c-3.13,0-5.667-2.5-5.667-2.5\n\t\t\t\ts2.537-2.5,5.667-2.5C-156.204,667.167-153.667,669.667-153.667,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-136.333,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-136.333,669.667-136.333,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-34,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-34,669.667-34,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-16.667,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-16.667,669.667-16.667,669.667z\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#42B19D\" d=\"M-378.983,757.672c-1.511,0-3.045-0.173-4.581-0.532c-10.746-2.519-17.418-13.266-14.914-24.011\n\t\t\t\t\tc4.118-17.809,6.811-58.796-9.045-58.812c-9.413-0.01-7.944,9.739-8.467,13.884c-1.228,9.731-2.756,21.844-10.152,32.478\n\t\t\t\t\tc-8.896,12.788-23.532,19.622-43.502,20.311c-11.077,0.373-20.297-8.261-20.678-19.299c-0.38-11.039,8.26-20.297,19.299-20.678\n\t\t\t\t\tc6.31-0.218,10.812-1.404,12.043-3.175c1.78-2.559,2.589-8.979,3.304-14.644c1.169-9.272,2.496-19.782,8.566-29.345\n\t\t\t\t\tc7.765-12.232,20.539-18.793,37.966-19.499c20.655-0.854,32.962,8.646,39.656,16.747c10.779,13.045,15.587,32.848,14.291,58.856\n\t\t\t\t\tc-0.864,17.33-4.189,31.676-4.331,32.277C-361.688,751.45-369.906,757.672-378.983,757.672z\"/>\n\t\t\t</g>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<path fill=\"#E2584C\" d=\"M-210.333,780.333c-11.046,0-20-8.954-20-20v-86.666c0-11.046,8.954-20,20-20s20,8.954,20,20v86.666\n\t\t\t\t\tC-190.333,771.379-199.288,780.333-210.333,780.333z\"/>\n\t\t\t</g>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-213.333,669.667c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tS-213.333,669.667-213.333,669.667z\"/>\n\t\t\t<path display=\"inline\" fill=\"#FFFFFF\" d=\"M-196,669.667c0,0-2.537,2.5-5.667,2.5c-3.13,0-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5\n\t\t\t\tC-198.537,667.167-196,669.667-196,669.667z\"/>\n\t\t\t<g display=\"inline\">\n\t\t\t\t<defs>\n\t\t\t\t\t<path id=\"SVGID_15_\" d=\"M-74.397,368.534c0,6.439-6.014,11.658-13.432,11.658s-13.433-5.22-13.433-11.658S-108.75,319-87,319.25\n\t\t\t\t\t\tS-74.397,362.095-74.397,368.534z\"/>\n\t\t\t\t</defs>\n\t\t\t\t<clipPath id=\"SVGID_16_\">\n\t\t\t\t\t<use xlink:href=\"#SVGID_15_\"  overflow=\"visible\"/>\n\t\t\t\t</clipPath>\n\t\t\t\t<g clip-path=\"url(#SVGID_16_)\">\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#EBC755\" d=\"M-88.056,422.706c-6.838,0-12.381-5.543-12.381-12.381v-53.649c0-6.838,5.543-12.381,12.381-12.381\n\t\t\t\t\t\t\tc6.838,0,12.381,5.543,12.381,12.381v53.649C-75.676,417.163-81.219,422.706-88.056,422.706z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<path fill=\"#FFFFFF\" d=\"M-89.913,354.2c0,0-1.571,1.548-3.508,1.548s-3.508-1.548-3.508-1.548s1.571-1.548,3.508-1.548\n\t\t\t\t\t\tS-89.913,354.2-89.913,354.2z\"/>\n\t\t\t\t\t<path fill=\"#FFFFFF\" d=\"M-79.183,354.2c0,0-1.571,1.548-3.508,1.548s-3.508-1.548-3.508-1.548s1.571-1.548,3.508-1.548\n\t\t\t\t\t\tS-79.183,354.2-79.183,354.2z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<circle display=\"inline\" cx=\"-274.833\" cy=\"683.167\" r=\"3.167\"/>\n\t\t\t<g display=\"inline\" opacity=\"0.5\">\n\t\t\t\t<g>\n\t\t\t\t\t<g enable-background=\"new    \">\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t<polygon id=\"SVGID_17_\" enable-background=\"new    \" points=\"-176.386,392.016 -169.129,348.955 -133.251,349.627 \n\t\t\t\t\t\t\t\t-140.434,393.717 \t\t\t\t\t\"/>\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t\t<clipPath id=\"SVGID_18_\">\n\t\t\t\t\t\t\t<use xlink:href=\"#SVGID_17_\"  overflow=\"visible\"/>\n\t\t\t\t\t\t</clipPath>\n\t\t\t\t\t\t<g clip-path=\"url(#SVGID_18_)\">\n\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t\t\t\t<path fill=\"#F8F2E5\" d=\"M-151.399,349.287c-2.473-0.046-4.922,0.513-7.233,1.563c-2.306,1.047-4.477,2.582-6.402,4.493\n\t\t\t\t\t\t\t\t\t\t\tc-1.922,1.907-3.599,4.191-4.921,6.739c-1.321,2.547-2.289,5.361-2.79,8.333c-0.501,2.975-0.488,5.829-0.034,8.446\n\t\t\t\t\t\t\t\t\t\t\tc0.455,2.622,1.353,5.008,2.621,7.038c1.271,2.036,2.916,3.715,4.859,4.915c1.95,1.204,4.201,1.927,6.679,2.044\n\t\t\t\t\t\t\t\t\t\t\tc2.486,0.118,4.963-0.385,7.314-1.398c2.356-1.015,4.583-2.542,6.562-4.466c1.982-1.927,3.712-4.252,5.071-6.858\n\t\t\t\t\t\t\t\t\t\t\tc1.36-2.607,2.347-5.492,2.844-8.538c0.496-3.043,0.454-5.954-0.046-8.61c-0.499-2.651-1.453-5.045-2.781-7.064\n\t\t\t\t\t\t\t\t\t\t\tc-1.325-2.013-3.021-3.651-5.009-4.796C-146.648,349.985-148.918,349.333-151.399,349.287\"/>\n\t\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t<path display=\"inline\" fill=\"none\" stroke=\"#42B19D\" stroke-width=\"40\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"\n\t\t\t\tM-632,579c0,0-8-97,53-97s31,63,91,63s54-124,54-124\"/>\n\t\t</g>\n\t\t\n\t\t<g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M93.729,230.969c-1.229-1.403-5.014-0.029-8.691,4.254l-15.494,18.043l1.805,2.061\n\t\t\t\t\t\tc0,0,10.046-11.699,11.216-13.062c2.381-2.773,5.47-6.226,6.071-5.538s-0.6,1.942-1.882,3.435\n\t\t\t\t\t\tc-8.815,10.266-10.268,15.82-8.834,17.458l5.81-6.766c-0.865-0.988,0.76-3.892,4.829-8.63c3.016-3.512,4.369-6,4.975-7.47\n\t\t\t\t\t\tC94.268,232.97,94.335,231.662,93.729,230.969z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M73.302,258.081c4.699-5.619,6.491-12.282,4.004-14.883c-2.487-2.601-8.313-0.154-13.011,5.465\n\t\t\t\t\tc-4.699,5.619-6.491,12.282-4.004,14.883S68.604,263.7,73.302,258.081z\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"80.478,224.827 75.21,223.998 66.108,236.924 69.519,240.362 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"89.929,221.327 85.193,220.685 66.001,247.98 69.412,251.418 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"72.032,222.469 67.218,222.022 59.027,232.447 62.438,235.885 \t\t\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M63.263,256.391c6.266-3.334,10.729-12.172,9.968-19.74c-0.76-7.568-6.456-11-12.722-7.666\n\t\t\t\t\tc-6.266,3.334-10.729,12.172-9.968,19.74C51.302,256.293,56.998,259.725,63.263,256.391z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#B7B3AB\" d=\"M98.076,213.564c-2.042,0-4.228-1.275-4.228-3.174v-8h3c0,0,0,5.187,0,5.792\n\t\t\t\t\t\tc0,1.229,0.104,2.792,1.104,2.792s0.896-0.588,0.896-1.25c0-4.552,2.783-6.167,5.167-6.167v3c-1.438,0-2.167,1.065-2.167,3.167\n\t\t\t\t\t\tc0,1.557-0.657,2.46-1.208,2.944C99.97,213.253,99.084,213.564,98.076,213.564z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M95.848,210.389v-8h-2v8c0,1.899,2.186,3.174,4.228,3.174c0.341,0,0.661-0.048,0.97-0.118\n\t\t\t\t\t\tC97.362,213.104,95.848,211.968,95.848,210.389z\"/>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M98.848,210.181c0,0,0.693,0.035,0.875-1.416c0.208-1.667,1-4.875,4.292-4.804\n\t\t\t\t\t\tc0.042,0.001,0-0.404,0-0.404c-2.383,0-5.167,1.615-5.167,6.167V210.181z\"/>\n\t\t\t\t</g>\n\t\t\t\t<ellipse fill=\"#B7B3AB\" cx=\"90.514\" cy=\"203.223\" rx=\"7.167\" ry=\"7.5\"/>\n\t\t\t\t<path fill=\"#87837F\" d=\"M83.348,203.223c0,4.142,3.209,7.5,7.167,7.5c0.208,0,0.413-0.014,0.616-0.033\n\t\t\t\t\tc2.122-1.302,3.55-3.708,3.55-6.467c0-4.142-3.209-7.5-7.167-7.5c-0.208,0-0.413,0.014-0.616,0.033\n\t\t\t\t\tC84.776,198.057,83.348,200.463,83.348,203.223z\"/>\n\t\t\t\t<rect x=\"75.014\" y=\"217.389\" fill=\"#B7B3AB\" width=\"5.333\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"74.764\" y=\"217.389\" fill=\"#87837F\" width=\"2.5\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"84.681\" y=\"210.056\" fill=\"#B7B3AB\" width=\"5.333\" height=\"11.333\"/>\n\t\t\t\t<rect x=\"84.681\" y=\"210.056\" fill=\"#87837F\" width=\"2.333\" height=\"11.333\"/>\n\t\t\t\t<rect x=\"66.681\" y=\"215.056\" fill=\"#B7B3AB\" width=\"5.333\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"66.494\" y=\"215.056\" fill=\"#87837F\" width=\"2.708\" height=\"7.667\"/>\n\n\t\t\t\t\t<ellipse transform=\"matrix(0.9118 -0.4107 0.4107 0.9118 -79.3698 50.5674)\" fill=\"#B7B3AB\" cx=\"78\" cy=\"210\" rx=\"12.82\" ry=\"10.532\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M66.311,215.266c1.32,2.931,4.104,4.829,7.418,5.455c1.201-0.216,2.411-0.584,3.597-1.118\n\t\t\t\t\t\tc6.456-2.908,14.188-11.38,11.188-16.88s-10.5-4.167-14.84-2.326C67.156,203.162,63.922,209.962,66.311,215.266z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#87837F\" d=\"M96.348,203.639c0,2.439-1.455,4.417-3.25,4.417c-1.795,0-3.25-1.977-3.25-4.417s0.167-4.417,3.25-4.417\n\t\t\t\t\tC96.181,199.223,96.348,201.2,96.348,203.639z\"/>\n\t\t\t</g>\n\t\t</g>\n\t\t<g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M53.142,254.768c-0.976-1.115-3.984-0.023-6.907,3.381l-12.313,14.339l1.434,1.638\n\t\t\t\t\t\tc0,0,7.983-9.297,8.914-10.38c1.892-2.204,4.347-4.947,4.825-4.401s-0.476,1.543-1.495,2.73\n\t\t\t\t\t\tc-7.005,8.158-8.16,12.572-7.021,13.873l4.617-5.377c-0.687-0.785,0.604-3.093,3.838-6.858c2.397-2.791,3.472-4.768,3.953-5.936\n\t\t\t\t\t\tC53.571,256.359,53.624,255.319,53.142,254.768z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M37.705,272.34c3.734-4.465,5.158-9.761,3.182-11.827c-1.977-2.067-6.606-0.122-10.34,4.343\n\t\t\t\t\ts-5.158,9.761-3.182,11.827C29.341,278.75,33.971,276.806,37.705,272.34z\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"43.407,245.914 39.221,245.255 31.987,255.528 34.698,258.26 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"50.918,243.132 47.154,242.622 31.903,264.313 34.613,267.045 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"36.695,244.04 32.869,243.685 26.36,251.969 29.071,254.701 \t\t\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M29.727,270.997c4.979-2.65,8.526-9.673,7.922-15.687c-0.604-6.014-5.13-8.742-10.11-6.092\n\t\t\t\t\ts-8.526,9.673-7.922,15.687C20.221,270.919,24.748,273.647,29.727,270.997z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#B7B3AB\" d=\"M57.392,236.963c-1.623,0-3.36-1.014-3.36-2.523v-6.357h2.384c0,0,0,4.122,0,4.602\n\t\t\t\t\t\tc0,0.977,0.083,2.219,0.877,2.219s0.712-0.467,0.712-0.993c0-3.617,2.212-4.9,4.106-4.9v2.384c-1.142,0-1.722,0.847-1.722,2.516\n\t\t\t\t\t\tc0,1.237-0.522,1.955-0.96,2.339C58.897,236.717,58.193,236.963,57.392,236.963z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M55.621,234.441v-6.357h-1.589v6.357c0,1.509,1.737,2.523,3.36,2.523c0.271,0,0.525-0.038,0.771-0.094\n\t\t\t\t\t\tC56.825,236.598,55.621,235.695,55.621,234.441z\"/>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M58.005,234.275c0,0,0.551,0.028,0.695-1.126c0.166-1.324,0.795-3.874,3.411-3.818\n\t\t\t\t\t\tc0.033,0.001,0-0.321,0-0.321c-1.894,0-4.106,1.283-4.106,4.9V234.275z\"/>\n\t\t\t\t</g>\n\t\t\t\t<ellipse fill=\"#B7B3AB\" cx=\"51.383\" cy=\"228.745\" rx=\"5.695\" ry=\"5.96\"/>\n\t\t\t\t<path fill=\"#87837F\" d=\"M45.687,228.745c0,3.292,2.55,5.96,5.695,5.96c0.165,0,0.328-0.011,0.49-0.026\n\t\t\t\t\tc1.686-1.035,2.821-2.946,2.821-5.14c0-3.292-2.55-5.96-5.695-5.96c-0.165,0-0.328,0.011-0.49,0.026\n\t\t\t\t\tC46.823,224.641,45.687,226.552,45.687,228.745z\"/>\n\t\t\t\t<rect x=\"39.065\" y=\"240.003\" fill=\"#B7B3AB\" width=\"4.238\" height=\"6.093\"/>\n\t\t\t\t<rect x=\"38.866\" y=\"240.003\" fill=\"#87837F\" width=\"1.987\" height=\"6.093\"/>\n\t\t\t\t<rect x=\"46.747\" y=\"234.176\" fill=\"#B7B3AB\" width=\"4.238\" height=\"9.006\"/>\n\t\t\t\t<rect x=\"46.747\" y=\"234.176\" fill=\"#87837F\" width=\"1.854\" height=\"9.006\"/>\n\t\t\t\t<rect x=\"32.443\" y=\"238.149\" fill=\"#B7B3AB\" width=\"4.238\" height=\"6.093\"/>\n\t\t\t\t<rect x=\"32.294\" y=\"238.149\" fill=\"#87837F\" width=\"2.152\" height=\"6.093\"/>\n\n\t\t\t\t\t<ellipse transform=\"matrix(0.9118 -0.4107 0.4107 0.9118 -92.5074 37.6797)\" fill=\"#B7B3AB\" cx=\"41.438\" cy=\"234.131\" rx=\"10.188\" ry=\"8.37\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M32.149,238.316c1.049,2.329,3.262,3.838,5.895,4.335c0.954-0.172,1.916-0.464,2.859-0.888\n\t\t\t\t\t\tc5.13-2.311,11.275-9.044,8.891-13.414S41.449,225.037,38,226.5C32.82,228.697,30.25,234.101,32.149,238.316z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#87837F\" d=\"M56.018,229.077c0,1.938-1.156,3.51-2.583,3.51s-2.583-1.571-2.583-3.51c0-1.938,0.132-3.51,2.583-3.51\n\t\t\t\t\tS56.018,227.138,56.018,229.077z\"/>\n\t\t\t</g>\n\t\t</g>\n\t\t<g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M65.092,279.742c-1.229-1.403-5.014-0.029-8.691,4.254l-15.494,18.043l1.805,2.061\n\t\t\t\t\t\tc0,0,10.046-11.699,11.216-13.062c2.381-2.773,5.47-6.226,6.071-5.538s-0.6,1.942-1.882,3.435\n\t\t\t\t\t\tc-8.815,10.266-10.268,15.82-8.834,17.458l5.81-6.766c-0.865-0.988,0.76-3.892,4.829-8.63c3.016-3.512,4.369-6,4.975-7.47\n\t\t\t\t\t\tC65.632,281.743,65.699,280.435,65.092,279.742z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M44.302,306.581c4.699-5.619,6.491-12.282,4.004-14.883s-8.313-0.154-13.011,5.465\n\t\t\t\t\ts-6.491,12.282-4.004,14.883S39.604,312.2,44.302,306.581z\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"51.478,273.327 46.21,272.498 37.108,285.424 40.519,288.862 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"60.929,269.827 56.193,269.185 37.001,296.48 40.412,299.918 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"43.032,270.969 38.218,270.522 30.027,280.947 33.438,284.385 \t\t\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M34.263,304.891c6.266-3.334,10.729-12.172,9.968-19.74s-6.456-11-12.722-7.666\n\t\t\t\t\tc-6.266,3.334-10.729,12.172-9.968,19.74C22.302,304.793,27.998,308.225,34.263,304.891z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#B7B3AB\" d=\"M69.076,262.064c-2.042,0-4.228-1.275-4.228-3.174v-8h3c0,0,0,5.187,0,5.792\n\t\t\t\t\t\tc0,1.229,0.104,2.792,1.104,2.792s0.896-0.588,0.896-1.25c0-4.552,2.783-6.167,5.167-6.167v3c-1.438,0-2.167,1.065-2.167,3.167\n\t\t\t\t\t\tc0,1.557-0.657,2.46-1.208,2.944C70.97,261.753,70.084,262.064,69.076,262.064z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M66.848,258.889v-8h-2v8c0,1.899,2.186,3.174,4.228,3.174c0.341,0,0.661-0.048,0.97-0.118\n\t\t\t\t\t\tC68.362,261.604,66.848,260.468,66.848,258.889z\"/>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M69.848,258.681c0,0,0.693,0.035,0.875-1.416c0.208-1.667,1-4.875,4.292-4.804\n\t\t\t\t\t\tc0.042,0.001,0-0.404,0-0.404c-2.383,0-5.167,1.615-5.167,6.167V258.681z\"/>\n\t\t\t\t</g>\n\t\t\t\t<ellipse fill=\"#B7B3AB\" cx=\"61.514\" cy=\"251.723\" rx=\"7.167\" ry=\"7.5\"/>\n\t\t\t\t<path fill=\"#87837F\" d=\"M54.348,251.723c0,4.142,3.209,7.5,7.167,7.5c0.208,0,0.413-0.014,0.616-0.033\n\t\t\t\t\tc2.122-1.302,3.55-3.708,3.55-6.467c0-4.142-3.209-7.5-7.167-7.5c-0.208,0-0.413,0.014-0.616,0.033\n\t\t\t\t\tC55.776,246.557,54.348,248.963,54.348,251.723z\"/>\n\t\t\t\t<rect x=\"46.014\" y=\"265.889\" fill=\"#B7B3AB\" width=\"5.333\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"45.764\" y=\"265.889\" fill=\"#87837F\" width=\"2.5\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"55.681\" y=\"258.556\" fill=\"#B7B3AB\" width=\"5.333\" height=\"11.333\"/>\n\t\t\t\t<rect x=\"55.681\" y=\"258.556\" fill=\"#87837F\" width=\"2.333\" height=\"11.333\"/>\n\t\t\t\t<rect x=\"37.681\" y=\"263.556\" fill=\"#B7B3AB\" width=\"5.333\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"37.494\" y=\"263.556\" fill=\"#87837F\" width=\"2.708\" height=\"7.667\"/>\n\n\t\t\t\t\t<ellipse transform=\"matrix(0.9118 -0.4107 0.4107 0.9118 -101.849 42.936)\" fill=\"#B7B3AB\" cx=\"49\" cy=\"258.5\" rx=\"12.82\" ry=\"10.532\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M37.311,263.766c1.32,2.931,4.104,4.829,7.418,5.455c1.201-0.216,2.411-0.584,3.597-1.118\n\t\t\t\t\t\tc6.456-2.908,14.188-11.38,11.188-16.88s-10.5-4.167-14.84-2.326C38.156,251.662,34.922,258.462,37.311,263.766z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#87837F\" d=\"M67.348,252.139c0,2.439-1.455,4.417-3.25,4.417c-1.795,0-3.25-1.977-3.25-4.417s0.167-4.417,3.25-4.417\n\t\t\t\t\tC67.181,247.723,67.348,249.7,67.348,252.139z\"/>\n\t\t\t</g>\n\t\t</g>\n\t\t<g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#8FA268\" d=\"M310.592,462.742c-1.229-1.403-5.014-0.029-8.691,4.254l-15.494,18.043l1.805,2.061\n\t\t\t\t\t\tc0,0,10.046-11.699,11.216-13.062c2.381-2.773,5.47-6.226,6.071-5.538s-0.6,1.942-1.882,3.435\n\t\t\t\t\t\tc-8.815,10.266-10.268,15.82-8.834,17.458l5.81-6.766c-0.865-0.988,0.76-3.892,4.829-8.63c3.016-3.512,4.369-6,4.975-7.47\n\t\t\t\t\t\tC311.132,464.743,311.199,463.435,310.592,462.742z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M289.802,491.081c4.699-5.619,6.491-12.282,4.004-14.883s-8.313-0.154-13.011,5.465\n\t\t\t\t\ts-6.491,12.282-4.004,14.883S285.104,496.7,289.802,491.081z\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"296.978,457.827 291.71,456.998 282.608,469.924 286.019,473.362 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"306.429,454.327 301.693,453.685 282.501,480.98 285.912,484.418 \t\t\"/>\n\t\t\t\t<polygon fill=\"#8FA268\" points=\"288.532,455.469 283.718,455.022 275.527,465.447 278.938,468.885 \t\t\"/>\n\t\t\t\t<path fill=\"#8FA268\" d=\"M279.763,489.391c6.266-3.334,10.729-12.172,9.968-19.74c-0.76-7.568-6.456-11-12.722-7.666\n\t\t\t\t\tc-6.266,3.334-10.729,12.172-9.968,19.74C267.802,489.293,273.498,492.725,279.763,489.391z\"/>\n\t\t\t</g>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#B7B3AB\" d=\"M314.576,446.564c-2.042,0-4.228-1.275-4.228-3.174v-8h3c0,0,0,5.187,0,5.792\n\t\t\t\t\t\tc0,1.229,0.104,2.792,1.104,2.792s0.896-0.588,0.896-1.25c0-4.552,2.783-6.167,5.167-6.167v3c-1.438,0-2.167,1.065-2.167,3.167\n\t\t\t\t\t\tc0,1.557-0.657,2.46-1.208,2.944C316.47,446.253,315.584,446.564,314.576,446.564z\"/>\n\t\t\t\t</g>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M312.348,443.389v-8h-2v8c0,1.899,2.186,3.174,4.228,3.174c0.341,0,0.661-0.048,0.97-0.118\n\t\t\t\t\t\tC313.862,446.104,312.348,444.968,312.348,443.389z\"/>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M315.348,443.181c0,0,0.693,0.035,0.875-1.416c0.208-1.667,1-4.875,4.292-4.804\n\t\t\t\t\t\tc0.042,0.001,0-0.404,0-0.404c-2.383,0-5.167,1.615-5.167,6.167V443.181z\"/>\n\t\t\t\t</g>\n\t\t\t\t<ellipse fill=\"#B7B3AB\" cx=\"307.014\" cy=\"436.223\" rx=\"7.167\" ry=\"7.5\"/>\n\t\t\t\t<path fill=\"#87837F\" d=\"M299.848,436.223c0,4.142,3.209,7.5,7.167,7.5c0.208,0,0.413-0.014,0.616-0.033\n\t\t\t\t\tc2.122-1.302,3.55-3.708,3.55-6.467c0-4.142-3.209-7.5-7.167-7.5c-0.208,0-0.413,0.014-0.616,0.033\n\t\t\t\t\tC301.276,431.057,299.848,433.463,299.848,436.223z\"/>\n\t\t\t\t<rect x=\"291.514\" y=\"450.389\" fill=\"#B7B3AB\" width=\"5.333\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"291.264\" y=\"450.389\" fill=\"#87837F\" width=\"2.5\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"301.181\" y=\"443.056\" fill=\"#B7B3AB\" width=\"5.333\" height=\"11.333\"/>\n\t\t\t\t<rect x=\"301.181\" y=\"443.056\" fill=\"#87837F\" width=\"2.333\" height=\"11.333\"/>\n\t\t\t\t<rect x=\"283.181\" y=\"448.056\" fill=\"#B7B3AB\" width=\"5.333\" height=\"7.667\"/>\n\t\t\t\t<rect x=\"282.994\" y=\"448.056\" fill=\"#87837F\" width=\"2.708\" height=\"7.667\"/>\n\n\t\t\t\t\t<ellipse transform=\"matrix(0.9118 -0.4107 0.4107 0.9118 -155.9648 160.05)\" fill=\"#B7B3AB\" cx=\"294.5\" cy=\"443\" rx=\"12.82\" ry=\"10.532\"/>\n\t\t\t\t<g>\n\t\t\t\t\t<path fill=\"#87837F\" d=\"M282.811,448.266c1.32,2.931,4.104,4.829,7.418,5.455c1.201-0.216,2.411-0.584,3.597-1.118\n\t\t\t\t\t\tc6.456-2.908,14.188-11.38,11.188-16.88s-10.5-4.167-14.84-2.326C283.656,436.162,280.422,442.962,282.811,448.266z\"/>\n\t\t\t\t</g>\n\t\t\t\t<path fill=\"#87837F\" d=\"M312.848,436.639c0,2.439-1.455,4.417-3.25,4.417s-3.25-1.977-3.25-4.417c0-2.439,0.167-4.417,3.25-4.417\n\t\t\t\t\tS312.848,434.2,312.848,436.639z\"/>\n\t\t\t</g>\n\t\t</g>\n\t\t\n\t\t</svg>\n\t\t\n\t\t<div id=\"cube-hitarea\">\n\t\t\t<div id=\"cube\">\n\t\t\t\t<svg class=\"side\"  width=\"100px\" height=\"100px\">\n\t\t\t\t\t<rect fill=\"#DAD6CC\" width=\"74\" height=\"74\"/>\n\t\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"37\" cy=\"37\" r=\"27\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t\t<svg class=\"side\"  width=\"100px\" height=\"100px\">\n\t\t\t\t\t<rect fill=\"#DAD6CC\" width=\"74\" height=\"74\"/>\n\t\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"37\" cy=\"37\" r=\"27\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"59.75\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"14.25\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t\t<svg class=\"side\"  width=\"100px\" height=\"100px\">\n\t\t\t\t\t<rect fill=\"#DAD6CC\" width=\"74\" height=\"74\"/>\n\t\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"37\" cy=\"37\" r=\"27\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"59.75\" cy=\"16.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"14.25\" cy=\"57.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t\t<svg class=\"side\"  width=\"100px\" height=\"100px\">\n\t\t\t\t\t<rect fill=\"#dddddd\" width=\"74\" height=\"74\"/>\n\t\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"37\" cy=\"37\" r=\"27\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"16.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"59.75\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"14.25\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"57.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t\t<svg class=\"side\"  width=\"100px\" height=\"100px\">\n\t\t\t\t\t<rect fill=\"#cccccc\" width=\"74\" height=\"74\"/>\n\t\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"37\" cy=\"37\" r=\"27\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"16.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"59.75\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"14.25\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"37\" cy=\"57.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t\t<svg class=\"side\"  width=\"100px\" height=\"100px\">\n\t\t\t\t\t<rect fill=\"#efefef\" width=\"74\" height=\"74\"/>\n\t\t\t\t\t<circle fill=\"#F8F1E5\" cx=\"38\" cy=\"37\" r=\"27\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"60.75\" cy=\"16.5\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"38\" cy=\"16.5\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"15.25\" cy=\"16.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"60.75\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"38\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"15.25\" cy=\"37\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t\t<g>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"60.75\" cy=\"57.5\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"38\" cy=\"57.5\" r=\"6\"/>\n\t\t\t\t\t\t\t<circle fill=\"#9B9993\" cx=\"15.25\" cy=\"57.5\" r=\"6\"/>\n\t\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script src=\"js/jquery-1.9.0.min.js\"></script>\n\t\t<script src=\"js/underscore.js\"></script>\n\t\t<script src=\"js/backbone.js\"></script>\n\t\t<script src=\"js/seedrandom.js\"></script>\n\t\t<script src=\"js/path-animal.js\"></script>\n\t\t<script src=\"js/tree-face.js\"></script>\n\t\t\n\t\t<script src=\"js/snap.svg.js\"></script>\n\t\t<script src=\"js/main.js\"></script>\n\t</body>\n</html>\n"
  },
  {
    "path": "demos/animated-game/js/backbone.js",
    "content": "//     Backbone.js 1.0.0\n\n//     (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc.\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(root, factory) {\n  // Set up Backbone appropriately for the environment.\n  if (typeof exports !== 'undefined') {\n    // Node/CommonJS, no need for jQuery in that case.\n    factory(root, exports, require('underscore'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    });\n  } else {\n    // Browser globals\n    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));\n  }\n}(this, function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create local references to array methods we'll want to use later.\n  var array = [];\n  var push = array.push;\n  var slice = array.slice;\n  var splice = array.splice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.0.0';\n\n  // For Backbone's purposes, jQuery, Zepto, or Ender owns the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may bind with `on` or remove with `off` callback\n  // functions to an event; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {\n\n    // Bind an event to a `callback` function. Passing `\"all\"` will bind\n    // the callback to all events fired.\n    on: function(name, callback, context) {\n      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;\n      this._events || (this._events = {});\n      var events = this._events[name] || (this._events[name] = []);\n      events.push({callback: callback, context: context, ctx: context || this});\n      return this;\n    },\n\n    // Bind an event to only be triggered a single time. After the first time\n    // the callback is invoked, it will be removed.\n    once: function(name, callback, context) {\n      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;\n      var self = this;\n      var once = _.once(function() {\n        self.off(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n      return this.on(name, once, context);\n    },\n\n    // Remove one or many callbacks. If `context` is null, removes all\n    // callbacks with that function. If `callback` is null, removes all\n    // callbacks for the event. If `name` is null, removes all bound\n    // callbacks for all events.\n    off: function(name, callback, context) {\n      var retain, ev, events, names, i, l, j, k;\n      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;\n      if (!name && !callback && !context) {\n        this._events = {};\n        return this;\n      }\n\n      names = name ? [name] : _.keys(this._events);\n      for (i = 0, l = names.length; i < l; i++) {\n        name = names[i];\n        if (events = this._events[name]) {\n          this._events[name] = retain = [];\n          if (callback || context) {\n            for (j = 0, k = events.length; j < k; j++) {\n              ev = events[j];\n              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||\n                  (context && context !== ev.context)) {\n                retain.push(ev);\n              }\n            }\n          }\n          if (!retain.length) delete this._events[name];\n        }\n      }\n\n      return this;\n    },\n\n    // Trigger one or many events, firing all bound callbacks. Callbacks are\n    // passed the same arguments as `trigger` is, apart from the event name\n    // (unless you're listening on `\"all\"`, which will cause your callback to\n    // receive the true name of the event as the first argument).\n    trigger: function(name) {\n      if (!this._events) return this;\n      var args = slice.call(arguments, 1);\n      if (!eventsApi(this, 'trigger', name, args)) return this;\n      var events = this._events[name];\n      var allEvents = this._events.all;\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, arguments);\n      return this;\n    },\n\n    // Tell this object to stop listening to either specific events ... or\n    // to every object it's currently listening to.\n    stopListening: function(obj, name, callback) {\n      var listeners = this._listeners;\n      if (!listeners) return this;\n      var deleteListener = !name && !callback;\n      if (typeof name === 'object') callback = this;\n      if (obj) (listeners = {})[obj._listenerId] = obj;\n      for (var id in listeners) {\n        listeners[id].off(name, callback, this);\n        if (deleteListener) delete this._listeners[id];\n      }\n      return this;\n    }\n\n  };\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // Implement fancy features of the Events API such as multiple event\n  // names `\"change blur\"` and jQuery-style event maps `{change: action}`\n  // in terms of the existing API.\n  var eventsApi = function(obj, action, name, rest) {\n    if (!name) return true;\n\n    // Handle event maps.\n    if (typeof name === 'object') {\n      for (var key in name) {\n        obj[action].apply(obj, [key, name[key]].concat(rest));\n      }\n      return false;\n    }\n\n    // Handle space separated event names.\n    if (eventSplitter.test(name)) {\n      var names = name.split(eventSplitter);\n      for (var i = 0, l = names.length; i < l; i++) {\n        obj[action].apply(obj, [names[i]].concat(rest));\n      }\n      return false;\n    }\n\n    return true;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);\n    }\n  };\n\n  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};\n\n  // Inversion-of-control versions of `on` and `once`. Tell *this* object to\n  // listen to an event in another object ... keeping track of what it's\n  // listening to.\n  _.each(listenMethods, function(implementation, method) {\n    Events[method] = function(obj, name, callback) {\n      var listeners = this._listeners || (this._listeners = {});\n      var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));\n      listeners[id] = obj;\n      if (typeof name === 'object') callback = this;\n      obj[implementation](name, callback, this);\n      return this;\n    };\n  });\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var defaults;\n    var attrs = attributes || {};\n    options || (options = {});\n    this.cid = _.uniqueId('c');\n    this.attributes = {};\n    _.extend(this, _.pick(options, modelOptions));\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    if (defaults = _.result(this, 'defaults')) {\n      attrs = _.defaults({}, attrs, defaults);\n    }\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // A list of options to be attached directly to the model, if provided.\n  var modelOptions = ['url', 'urlRoot', 'collection'];\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      var attr, attrs, unset, changes, silent, changing, prev, current;\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      unset           = options.unset;\n      silent          = options.silent;\n      changes         = [];\n      changing        = this._changing;\n      this._changing  = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n      current = this.attributes, prev = this._previousAttributes;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // For each `set` attribute, update or delete the current value.\n      for (attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          this.changed[attr] = val;\n        } else {\n          delete this.changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = true;\n        for (var i = 0, l = changes.length; i < l; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var val, changed = false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      for (var attr in diff) {\n        if (_.isEqual(old[attr], (val = diff[attr]))) continue;\n        (changed || (changed = {}))[attr] = val;\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overridden,\n    // triggering a `\"change\"` event.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        if (!model.set(model.parse(resp, options), options)) return false;\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      var attrs, method, xhr, attributes = this.attributes;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      // If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`.\n      if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;\n\n      options = _.extend({validate: true}, options);\n\n      // Do not persist invalid models.\n      if (!this._validate(attrs, options)) return false;\n\n      // Set temporary attributes if `{wait: true}`.\n      if (attrs && options.wait) {\n        this.attributes = _.extend({}, attributes, attrs);\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = model.parse(resp, options);\n        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);\n        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {\n          return false;\n        }\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');\n      if (method === 'patch') options.attrs = attrs;\n      xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      if (attrs && options.wait) this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n\n      var destroy = function() {\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (options.wait || model.isNew()) destroy();\n        if (success) success(model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      if (this.isNew()) {\n        options.success();\n        return false;\n      }\n      wrapError(this, options);\n\n      var xhr = this.sync('delete', this, options);\n      if (!options.wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();\n      if (this.isNew()) return base;\n      return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return this.id == null;\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend(options || {}, { validate: true }));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Model.\n  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];\n\n  // Mix in each Underscore method as a proxy to `Model#attributes`.\n  _.each(modelMethods, function(method) {\n    Model.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.attributes);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analagous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.url) this.url = options.url;\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, merge: false, remove: false};\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model){ return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set.\n    add: function(models, options) {\n      return this.set(models, _.defaults(options || {}, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      models = _.isArray(models) ? models.slice() : [models];\n      options || (options = {});\n      var i, l, index, model;\n      for (i = 0, l = models.length; i < l; i++) {\n        model = this.get(models[i]);\n        if (!model) continue;\n        delete this._byId[model.id];\n        delete this._byId[model.cid];\n        index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n        this._removeReference(model);\n      }\n      return this;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      options = _.defaults(options || {}, setOptions);\n      if (options.parse) models = this.parse(models, options);\n      if (!_.isArray(models)) models = models ? [models] : [];\n      var i, l, model, attrs, existing, sort;\n      var at = options.at;\n      var sortable = this.comparator && (at == null) && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n      var toAdd = [], toRemove = [], modelMap = {};\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      for (i = 0, l = models.length; i < l; i++) {\n        if (!(model = this._prepareModel(models[i], options))) continue;\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        if (existing = this.get(model)) {\n          if (options.remove) modelMap[existing.cid] = true;\n          if (options.merge) {\n            existing.set(model.attributes, options);\n            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;\n          }\n\n        // This is a new model, push it to the `toAdd` list.\n        } else if (options.add) {\n          toAdd.push(model);\n\n          // Listen to added models' events, and index models for lookup by\n          // `id` and by `cid`.\n          model.on('all', this._onModelEvent, this);\n          this._byId[model.cid] = model;\n          if (model.id != null) this._byId[model.id] = model;\n        }\n      }\n\n      // Remove nonexistent models if appropriate.\n      if (options.remove) {\n        for (i = 0, l = this.length; i < l; ++i) {\n          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this.remove(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      if (toAdd.length) {\n        if (sortable) sort = true;\n        this.length += toAdd.length;\n        if (at != null) {\n          splice.apply(this.models, [at, 0].concat(toAdd));\n        } else {\n          push.apply(this.models, toAdd);\n        }\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      if (options.silent) return this;\n\n      // Trigger `add` events.\n      for (i = 0, l = toAdd.length; i < l; i++) {\n        (model = toAdd[i]).trigger('add', model, this, options);\n      }\n\n      // Trigger `sort` if the collection was sorted.\n      if (sort) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options || (options = {});\n      for (var i = 0, l = this.models.length; i < l; i++) {\n        this._removeReference(this.models[i]);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return this;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      model = this._prepareModel(model, options);\n      this.add(model, _.extend({at: this.length}, options));\n      return model;\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      model = this._prepareModel(model, options);\n      this.add(model, _.extend({at: 0}, options));\n      return model;\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function(begin, end) {\n      return this.models.slice(begin, end);\n    },\n\n    // Get a model from the set by id.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj.id != null ? obj.id : obj.cid || obj];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      if (_.isEmpty(attrs)) return first ? void 0 : [];\n      return this[first ? 'find' : 'filter'](function(model) {\n        for (var key in attrs) {\n          if (attrs[key] !== model.get(key)) return false;\n        }\n        return true;\n      });\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      // Run sort based on type of `comparator`.\n      if (_.isString(this.comparator) || this.comparator.length === 1) {\n        this.models = this.sortBy(this.comparator, this);\n      } else {\n        this.models.sort(_.bind(this.comparator, this));\n      }\n\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Figure out the smallest index at which a model should be inserted so as\n    // to maintain order.\n    sortedIndex: function(model, value, context) {\n      value || (value = this.comparator);\n      var iterator = _.isFunction(value) ? value : function(model) {\n        return model.get(value);\n      };\n      return _.sortedIndex(this.models, model, iterator, context);\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return _.invoke(this.models, 'get', attr);\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success(collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      if (!(model = this._prepareModel(model, options))) return false;\n      if (!options.wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(resp) {\n        if (options.wait) collection.add(model, options);\n        if (success) success(model, resp, options);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models);\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (attrs instanceof Model) {\n        if (!attrs.collection) attrs.collection = this;\n        return attrs;\n      }\n      options || (options = {});\n      options.collection = this;\n      var model = new this.model(attrs, options);\n      if (!model._validate(attrs, options)) {\n        this.trigger('invalid', this, attrs, options);\n        return false;\n      }\n      return model;\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model) {\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if ((event === 'add' || event === 'remove') && collection !== this) return;\n      if (event === 'destroy') this.remove(model, options);\n      if (model && event === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        if (model.id != null) this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',\n    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',\n    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',\n    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',\n    'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf',\n    'isEmpty', 'chain'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Collection.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.models);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Underscore methods that take a property name as an argument.\n  var attributeMethods = ['groupBy', 'countBy', 'sortBy'];\n\n  // Use attributes instead of properties.\n  _.each(attributeMethods, function(method) {\n    Collection.prototype[method] = function(value, context) {\n      var iterator = _.isFunction(value) ? value : function(model) {\n        return model.get(value);\n      };\n      return _[method](this.models, iterator, context);\n    };\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    this._configure(options || {});\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n    this.delegateEvents();\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be prefered to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this.$el.remove();\n      this.stopListening();\n      return this;\n    },\n\n    // Change the view's element (`this.el` property), including event\n    // re-delegation.\n    setElement: function(element, delegate) {\n      if (this.$el) this.undelegateEvents();\n      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);\n      this.el = this.$el[0];\n      if (delegate !== false) this.delegateEvents();\n      return this;\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save'\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents: function(events) {\n      if (!(events || (events = _.result(this, 'events')))) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[events[key]];\n        if (!method) continue;\n\n        var match = key.match(delegateEventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          this.$el.on(eventName, method);\n        } else {\n          this.$el.on(eventName, selector, method);\n        }\n      }\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view with `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // Performs the initial configuration of a View with a set of options.\n    // Keys with special meaning *(e.g. model, collection, id, className)* are\n    // attached directly to the view.  See `viewOptions` for an exhaustive\n    // list.\n    _configure: function(options) {\n      if (this.options) options = _.extend({}, _.result(this, 'options'), options);\n      _.extend(this, _.pick(options, viewOptions));\n      this.options = options;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);\n        this.setElement($el, false);\n      } else {\n        this.setElement(_.result(this, 'el'), false);\n      }\n    }\n\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // If we're sending a `PATCH` request, and we're in an old Internet Explorer\n    // that still has ActiveX enabled by default, override jQuery to use that\n    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.\n    if (params.type === 'PATCH' && window.ActiveXObject &&\n          !(window.external && window.external.msActiveXFilteringEnabled)) {\n      params.xhr = function() {\n        return new ActiveXObject(\"Microsoft.XMLHTTP\");\n      };\n    }\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch':  'PATCH',\n    'delete': 'DELETE',\n    'read':   'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        callback && callback.apply(router, args);\n        router.trigger.apply(router, ['route:' + name].concat(args));\n        router.trigger('route', name, args);\n        Backbone.history.trigger('route', router, name, args);\n      });\n      return this;\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n                   .replace(optionalParam, '(?:$1)?')\n                   .replace(namedParam, function(match, optional){\n                     return optional ? match : '([^\\/]+)';\n                   })\n                   .replace(splatParam, '(.*?)');\n      return new RegExp('^' + route + '$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param) {\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Cached regex for removing a trailing slash.\n  var trailingSlash = /\\/$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment: function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || !this._wantsHashChange || forcePushState) {\n          fragment = this.location.pathname;\n          var root = this.root.replace(trailingSlash, '');\n          if (!fragment.indexOf(root)) fragment = fragment.substr(root.length);\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error(\"Backbone.history has already been started\");\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({}, {root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      if (oldIE && this._wantsHashChange) {\n        this.iframe = Backbone.$('<iframe src=\"javascript:0\" tabindex=\"-1\" />').hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        Backbone.$(window).on('popstate', this.checkUrl);\n      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {\n        Backbone.$(window).on('hashchange', this.checkUrl);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      var loc = this.location;\n      var atRoot = loc.pathname.replace(/[^\\/]$/, '$&/') === this.root;\n\n      // If we've started off with a route from a `pushState`-enabled browser,\n      // but we're currently in a browser that doesn't support it...\n      if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) {\n        this.fragment = this.getFragment(null, true);\n        this.location.replace(this.root + this.location.search + '#' + this.fragment);\n        // Return immediately as browser will do redirect to new url\n        return true;\n\n      // Or if we've started out with a hash-based route, but we're currently\n      // in a browser where it could be `pushState`-based instead...\n      } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {\n        this.fragment = this.getHash().replace(routeStripper, '');\n        this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);\n      clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n      if (current === this.fragment && this.iframe) {\n        current = this.getFragment(this.getHash(this.iframe));\n      }\n      if (current === this.fragment) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl() || this.loadUrl(this.getHash());\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragmentOverride) {\n      var fragment = this.fragment = this.getFragment(fragmentOverride);\n      var matched = _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n      return matched;\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: options};\n      fragment = this.getFragment(fragment || '');\n      if (this.fragment === fragment) return;\n      this.fragment = fragment;\n      var url = this.root + fragment;\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._hasPushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if(!options.replace) this.iframe.document.open().close();\n          this._updateHash(this.iframe.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent's constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    var Surrogate = function(){ this.constructor = child; };\n    Surrogate.prototype = parent.prototype;\n    child.prototype = new Surrogate;\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function (model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error(model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  return Backbone;\n}));\n"
  },
  {
    "path": "demos/animated-game/js/main.js",
    "content": "var WIDTH = 1024,\n    HEIGHT = 720;\n    console.log('oh');\n\nvar MainView = Backbone.View.extend({\n    initialize: function () {\n\t\n\t\tvar i,\n\t\t\tdotGroup,\n\t\t\tanimal;\n\t\t\t\n        Math.seedrandom('fish');\n\n\t\tthis.state = 0;\n\t\tthis.dots = [];\n\t\tthis.animals = [];\n\t\tthis.trees = [];\n\t\tthis.treeFaces = [];\n\t\tthis.s = Snap(document.getElementsByTagName('svg')[0]);\n\t\t\n\t\t//dot animals\n\t\tdotGroup = this.s.select('#dots');\n\t\tthis.dots = dotGroup.selectAll('*');\n\t\t\n\t\tfor (i = 0; i < this.dots.length; i += 1) {\n\t\t\tanimal = new PathAnimal({s: this.s, dot: this.dots[i]});\n\t\t\tthis.animals.push(animal);\n\t\t}\n\t\t\n\t\t//sort depth\n\t\tfor (i = 0; i < this.animals.length; i += 1) {\n\t\t\tif (i > 0) {\n\t\t\t\tvar a = this.animals[i - 1].el,\n\t\t\t\t\tb = this.animals[i].el;\n\t\t\t\t\n\t\t\t\tif (a.matrix.split().dy > b.matrix.split().dy) {\n\t\t\t\t\ta.before(b);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t//trees\n\t\tthis.trees = this.s.selectAll('.tree');\n\t\tfor (i = 0; i < this.trees.length; i += 1) {\n\t\t\tvar tree = new TreeFace({s: this.s, tree: this.trees[i]});\n\t\t\tthis.treeFaces.push(tree);\n\t\t}\n\t\t\n\t\tthis.cube = document.getElementById('cube');\n\t\tvar $cubeHitArea = document.getElementById('cube-hitarea');\n\t\t$cubeHitArea.addEventListener('click', this.handle_ROLL.bind(this));\n\t\t\n\t\tsetTimeout(this.animate.bind(this), 3000);\n    },\n\n\thandle_ROLL: function () {\n\t\tthis.number = Math.ceil(Math.random() * 6);\n\t\tif (this.number == 6) {\n\t\t\trx = 45;\n\t\t\try = 180;\n\t\t\trz = -45;\n\t\t} else if (this.number == 5) {\n\t\t\trx = 50;\n\t\t\try = 0;\n\t\t\trz = 50;\t\t\t\n\t\t} else if (this.number == 4) {\n\t\t\trx = -45;\n\t\t\try = 50;\n\t\t\trz = 90;\n\t\t} else if (this.number == 3) {\n\t\t\trx = -45;\n\t\t\try = 225;\n\t\t\trz = -90;\n\t\t} else if (this.number == 2) {\n\t\t\trx = -45;\n\t\t\try = 50;\n\t\t\trz = 0;\n\t\t} else if (this.number == 1) {\n\t\t\trx = 145;\n\t\t\try = -45;\n\t\t\trz = 0;\n\t\t} else {\n\t\t\trx = -90;\n\t\t\try = 0;\n\t\t\trz = 0;\n\t\t}\n\t\t\n\t\tthis.cube.style['webkitTransform'] = 'rotateX(' + rx + 'deg) rotateY(' + ry + 'deg) rotateZ(' + rz + 'deg)';\n\t\tthis.cube.style['MozTransform'] = 'rotateX(' + rx + 'deg) rotateY(' + ry + 'deg) rotateZ(' + rz + 'deg)';\t\t\n\t},\n\t\n\ttrigger: function () {\n\t\tthis.state += 1;//this.number;\n\t\tvar animal = this.animals[this.state];\n\t\tanimal.handle_MOUSEOVER();\n\t\t\n\t},\n\n\tanimate: function () {\n\t\tvar tree = this.treeFaces[Math.floor(Math.random() * this.treeFaces.length)];\n\t\ttree.handle_MOUSEOVER();\n\t\t\n\t\tsetTimeout(function () {\n\t\t\ttree.handle_MOUSEOUT();\n\t\t}.bind(this), 3000);\n\t\t\n\t\tsetTimeout(this.animate.bind(this), 3000);\n\t}\n});\n\nvar main = new MainView();"
  },
  {
    "path": "demos/animated-game/js/path-animal.js",
    "content": "var PathAnimal = Backbone.View.extend({\n\tinitialize: function () {\n\t\tvar _x,\n\t\t\t_y,\n\t\t\tPATHS = [\n\t\t\t\t'M0,0c0,0,0-28.008,0-46.707S0-89,0-89',\n\t\t\t\t'M0,0c0,0-9.634-22.317,10-46.707S50-69,50-69',\n\t\t\t\t'M0,0c0,0,17.52-24.431,0-56.707S-50-99-50-99'\n\t\t\t];\n\t\t\n\t\tthis.s = this.options.s;\n\t\tthis.dot = this.options.dot;\n\t\t_x = this.dot.attr('cx');\n\t\t_y = this.dot.attr('cy');\n\t\t\n\t\tthis.el = this.s.g();\n\t\t\n\t\tthis.path = this.s.path(PATHS[Math.floor(Math.random() * PATHS.length)]);\n\t\tthis.totalLength = this.dashOffset = this.path.getTotalLength();\n\n\t\tthis.path.attr({\n\t\t\tfill: 'none',\n\t\t\tstroke: this.dot.attr('fill'),\n\t\t\tstrokeWidth: 25,\n\t\t\tstrokeMiterlimit: 10,\n\t\t\tstrokeLinecap: 'round',\n\t\t\topacity: 1,\n\t\t\tstrokeDasharray: this.totalLength + \" 200\",\n\t\t\tstrokeDashoffset: this.totalLength\n\t\t});\n\t\tthis.el.add(this.path);\n\t\t\n\t\tthis.el.transform(\"t\" + [_x, _y]);\n\t\t\n\t\tthis.hitarea = this.s.circle(_x, _y, 30);\n\t\tthis.hitarea.attr({\n\t\t\tfill: 'transparent',\n\t\t\t'class': 'hit-area'\n\t\t});\n\t\tthis.hitarea.mouseover(this.handle_MOUSEOVER.bind(this));\n\t\tthis.hitarea.mouseout(this.handle_MOUSEOUT.bind(this));\n\t\t\n\t\tthis.addFace();\n\t},\n\t\n\taddFace: function () {\n\t\tvar mouth,\n\t\t\teye,\n\t\t\tey2;\n\t\t\n\t\tthis.face = this.s.g();\n\t\tthis.face.attr({\n\t\t\t'class': 'face'\n\t\t});\n\t\t\n\t\tmouth = this.s.circle(0, 5, 4);\n\t\tmouth.attr({fill: 'black', 'class': 'mouth'});\n\t\tthis.face.add(mouth);\n\t\t\n\t\teye = this.s.path('M-2.75-6.75c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5S-2.75-6.75-2.75-6.75z');\n\t\teye.attr({fill: 'white', 'class': 'eye left'});\n\t\tthis.face.add(eye);\n\t\t\n\t\teye2 = this.s.path('M14.583-6.75c0,0-2.537,2.5-5.667,2.5S3.25-6.75,3.25-6.75s2.537-2.5,5.667-2.5S14.583-6.75,14.583-6.75z');\n\t\teye2.attr({fill: 'white', 'class': 'eye right'});\n\t\tthis.face.add(eye2);\n\t\t\n\t\tthis.face.transform(\"s.6\");\n\t\tthis.el.add(this.face);\n\t},\n\t\n\thandle_MOUSEOVER: function () {\n\t\tvar instance = this;\n        \n\t\tthis.face.attr({\n\t\t\t'class': 'face animating'\n\t\t});\n        Snap.animate(this.dashOffset, 0, function (val) {\n            instance.dashOffset = val;\n            instance.render();\n        }, 500);\n\t},\n\t\n\thandle_MOUSEOUT: function () {\n\t\tvar instance = this;\n        \n\t\tthis.face.attr({\n\t\t\t'class': 'face'\n\t\t});\n        Snap.animate(this.dashOffset, this.totalLength, function (val) {\n            instance.dashOffset = val;\n            instance.render();\n        }, 500);\n\t},\n\t\n\trender: function () {\n\t\tvar point;\n\t\t\n\t\tthis.path.attr({\n\t\t\t'stroke-dashoffset': this.dashOffset\n\t\t});\n\t\t\n\t\tpoint = this.path.getPointAtLength(this.totalLength - this.dashOffset);\n\t\tthis.face.transform(\"t\" + [point.x, point.y] + \"s.6\");\n\t}\n});"
  },
  {
    "path": "demos/animated-game/js/seedrandom.js",
    "content": "// seedrandom.js version 2.2.\n// Author: David Bau\n// Date: 2013 Jun 15\n//\n// Defines a method Math.seedrandom() that, when called, substitutes\n// an explicitly seeded RC4-based algorithm for Math.random().  Also\n// supports automatic seeding from local or network sources of entropy.\n//\n// http://davidbau.com/encode/seedrandom.js\n// http://davidbau.com/encode/seedrandom-min.js\n//\n// Usage:\n//\n//   <script src=http://davidbau.com/encode/seedrandom-min.js></script>\n//\n//   Math.seedrandom('yay.');  Sets Math.random to a function that is\n//                             initialized using the given explicit seed.\n//\n//   Math.seedrandom();        Sets Math.random to a function that is\n//                             seeded using the current time, dom state,\n//                             and other accumulated local entropy.\n//                             The generated seed string is returned.\n//\n//   Math.seedrandom('yowza.', true);\n//                             Seeds using the given explicit seed mixed\n//                             together with accumulated entropy.\n//\n//   <script src=\"https://jsonlib.appspot.com/urandom?callback=Math.seedrandom\">\n//   </script>                 Seeds using urandom bits from a server.\n//\n// More advanced examples:\n//\n//   Math.seedrandom(\"hello.\");           // Use \"hello.\" as the seed.\n//   document.write(Math.random());       // Always 0.9282578795792454\n//   document.write(Math.random());       // Always 0.3752569768646784\n//   var rng1 = Math.random;              // Remember the current prng.\n//\n//   var autoseed = Math.seedrandom();    // New prng with an automatic seed.\n//   document.write(Math.random());       // Pretty much unpredictable x.\n//\n//   Math.random = rng1;                  // Continue \"hello.\" prng sequence.\n//   document.write(Math.random());       // Always 0.7316977468919549\n//\n//   Math.seedrandom(autoseed);           // Restart at the previous seed.\n//   document.write(Math.random());       // Repeat the 'unpredictable' x.\n//\n//   function reseed(event, count) {      // Define a custom entropy collector.\n//     var t = [];\n//     function w(e) {\n//       t.push([e.pageX, e.pageY, +new Date]);\n//       if (t.length < count) { return; }\n//       document.removeEventListener(event, w);\n//       Math.seedrandom(t, true);        // Mix in any previous entropy.\n//     }\n//     document.addEventListener(event, w);\n//   }\n//   reseed('mousemove', 100);            // Reseed after 100 mouse moves.\n//\n// Version notes:\n//\n// The random number sequence is the same as version 1.0 for string seeds.\n// Version 2.0 changed the sequence for non-string seeds.\n// Version 2.1 speeds seeding and uses window.crypto to autoseed if present.\n// Version 2.2 alters non-crypto autoseeding to sweep up entropy from plugins.\n//\n// The standard ARC4 key scheduler cycles short keys, which means that\n// seedrandom('ab') is equivalent to seedrandom('abab') and 'ababab'.\n// Therefore it is a good idea to add a terminator to avoid trivial\n// equivalences on short string seeds, e.g., Math.seedrandom(str + '\\0').\n// Starting with version 2.0, a terminator is added automatically for\n// non-string seeds, so seeding with the number 111 is the same as seeding\n// with '111\\0'.\n//\n// When seedrandom() is called with zero args, it uses a seed\n// drawn from the browser crypto object if present.  If there is no\n// crypto support, seedrandom() uses the current time, the native rng,\n// and a walk of several DOM objects to collect a few bits of entropy.\n//\n// Each time the one- or two-argument forms of seedrandom are called,\n// entropy from the passed seed is accumulated in a pool to help generate\n// future seeds for the zero- and two-argument forms of seedrandom.\n//\n// On speed - This javascript implementation of Math.random() is about\n// 3-10x slower than the built-in Math.random() because it is not native\n// code, but that is typically fast enough.  Some details (timings on\n// Chrome 25 on a 2010 vintage macbook):\n//\n// seeded Math.random()          - avg less than 0.0002 milliseconds per call\n// seedrandom('explicit.')       - avg less than 0.2 milliseconds per call\n// seedrandom('explicit.', true) - avg less than 0.2 milliseconds per call\n// seedrandom() with crypto      - avg less than 0.2 milliseconds per call\n//\n// Autoseeding without crypto is somewhat slower, about 20-30 milliseconds on\n// a 2012 windows 7 1.5ghz i5 laptop, as seen on Firefox 19, IE 10, and Opera.\n// Seeded rng calls themselves are fast across these browsers, with slowest\n// numbers on Opera at about 0.0005 ms per seeded Math.random().\n//\n// LICENSE (BSD):\n//\n// Copyright 2013 David Bau, all rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   1. Redistributions of source code must retain the above copyright\n//      notice, this list of conditions and the following disclaimer.\n//\n//   2. Redistributions in binary form must reproduce the above copyright\n//      notice, this list of conditions and the following disclaimer in the\n//      documentation and/or other materials provided with the distribution.\n//\n//   3. Neither the name of this module nor the names of its contributors may\n//      be used to endorse or promote products derived from this software\n//      without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n/**\n * All code is in an anonymous closure to keep the global namespace clean.\n */\n(function (\n    global, pool, math, width, chunks, digits) {\n\n//\n// The following constants are related to IEEE 754 limits.\n//\nvar startdenom = math.pow(width, chunks),\n    significance = math.pow(2, digits),\n    overflow = significance * 2,\n    mask = width - 1;\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nmath['seedrandom'] = function(seed, use_entropy) {\n  var key = [];\n\n  // Flatten the seed string or build one from local entropy if needed.\n  var shortseed = mixkey(flatten(\n    use_entropy ? [seed, tostring(pool)] :\n    0 in arguments ? seed : autoseed(), 3), key);\n\n  // Use the seed to initialize an ARC4 generator.\n  var arc4 = new ARC4(key);\n\n  // Mix the randomness into accumulated entropy.\n  mixkey(tostring(arc4.S), pool);\n\n  // Override Math.random\n\n  // This function returns a random double in [0, 1) that contains\n  // randomness in every bit of the mantissa of the IEEE 754 value.\n\n  math['random'] = function() {         // Closure to return a random double:\n    var n = arc4.g(chunks),             // Start with a numerator n < 2 ^ 48\n        d = startdenom,                 //   and denominator d = 2 ^ 48.\n        x = 0;                          //   and no 'extra last byte'.\n    while (n < significance) {          // Fill up all significant digits by\n      n = (n + x) * width;              //   shifting numerator and\n      d *= width;                       //   denominator and generating a\n      x = arc4.g(1);                    //   new least-significant-byte.\n    }\n    while (n >= overflow) {             // To avoid rounding up, before adding\n      n /= 2;                           //   last byte, shift everything\n      d /= 2;                           //   right using integer math until\n      x >>>= 1;                         //   we have exactly the desired bits.\n    }\n    return (n + x) / d;                 // Form the number within [0, 1).\n  };\n\n  // Return the seed that was used\n  return shortseed;\n};\n\n//\n// ARC4\n//\n// An ARC4 implementation.  The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4.  Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\n/** @constructor */\nfunction ARC4(key) {\n  var t, keylen = key.length,\n      me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n\n  // The empty key [] is treated as [0].\n  if (!keylen) { key = [keylen++]; }\n\n  // Set up S using the standard key scheduling algorithm.\n  while (i < width) {\n    s[i] = i++;\n  }\n  for (i = 0; i < width; i++) {\n    s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\n    s[j] = t;\n  }\n\n  // The \"g\" method returns the next (count) outputs as one number.\n  (me.g = function(count) {\n    // Using instance members instead of closure state nearly doubles speed.\n    var t, r = 0,\n        i = me.i, j = me.j, s = me.S;\n    while (count--) {\n      t = s[i = mask & (i + 1)];\n      r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\n    }\n    me.i = i; me.j = j;\n    return r;\n    // For robust unpredictability discard an initial batch of values.\n    // See http://www.rsa.com/rsalabs/node.asp?id=2009\n  })(width);\n}\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\nfunction flatten(obj, depth) {\n  var result = [], typ = (typeof obj)[0], prop;\n  if (depth && typ == 'o') {\n    for (prop in obj) {\n      try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n    }\n  }\n  return (result.length ? result : typ == 's' ? obj : obj + '\\0');\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\nfunction mixkey(seed, key) {\n  var stringseed = seed + '', smear, j = 0;\n  while (j < stringseed.length) {\n    key[mask & j] =\n      mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\n  }\n  return tostring(key);\n}\n\n//\n// autoseed()\n// Returns an object for autoseeding, using window.crypto if available.\n//\n/** @param {Uint8Array=} seed */\nfunction autoseed(seed) {\n  try {\n    global.crypto.getRandomValues(seed = new Uint8Array(width));\n    return tostring(seed);\n  } catch (e) {\n    return [+new Date, global, global.navigator.plugins,\n            global.screen, tostring(pool)];\n  }\n}\n\n//\n// tostring()\n// Converts an array of charcodes to a string\n//\nfunction tostring(a) {\n  return String.fromCharCode.apply(0, a);\n}\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool.  Because we do\n// not want to intefere with determinstic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n// End anonymous scope, and pass initial values.\n})(\n  this,   // global window object\n  [],     // pool: entropy pool starts empty\n  Math,   // math: package containing random, pow, and seedrandom\n  256,    // width: each RC4 output is 0 <= x < 256\n  6,      // chunks: at least six RC4 outputs for each double\n  52      // digits: there are 52 significant digits in a double\n);"
  },
  {
    "path": "demos/animated-game/js/snap.svg.js",
    "content": "// Snap.svg 0.0.1\n// \n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// \n// build: 2013-10-15\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.4.2 - JavaScript Events Library                      │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n    var version = \"0.4.2\",\n        has = \"hasOwnProperty\",\n        separator = /[\\.\\/]/,\n        wildcard = \"*\",\n        fun = function () {},\n        numsort = function (a, b) {\n            return a - b;\n        },\n        current_event,\n        stop,\n        events = {n: {}},\n    /*\\\n     * eve\n     [ method ]\n\n     * Fires event with given `name`, given scope and other parameters.\n\n     > Arguments\n\n     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n     - scope (object) context for the event handlers\n     - varargs (...) the rest of arguments will be sent to event handlers\n\n     = (object) array of returned values from the listeners\n    \\*/\n        eve = function (name, scope) {\n\t\t\tname = String(name);\n            var e = events,\n                oldstop = stop,\n                args = Array.prototype.slice.call(arguments, 2),\n                listeners = eve.listeners(name),\n                z = 0,\n                f = false,\n                l,\n                indexed = [],\n                queue = {},\n                out = [],\n                ce = current_event,\n                errors = [];\n            current_event = name;\n            stop = 0;\n            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n                indexed.push(listeners[i].zIndex);\n                if (listeners[i].zIndex < 0) {\n                    queue[listeners[i].zIndex] = listeners[i];\n                }\n            }\n            indexed.sort(numsort);\n            while (indexed[z] < 0) {\n                l = queue[indexed[z++]];\n                out.push(l.apply(scope, args));\n                if (stop) {\n                    stop = oldstop;\n                    return out;\n                }\n            }\n            for (i = 0; i < ii; i++) {\n                l = listeners[i];\n                if (\"zIndex\" in l) {\n                    if (l.zIndex == indexed[z]) {\n                        out.push(l.apply(scope, args));\n                        if (stop) {\n                            break;\n                        }\n                        do {\n                            z++;\n                            l = queue[indexed[z]];\n                            l && out.push(l.apply(scope, args));\n                            if (stop) {\n                                break;\n                            }\n                        } while (l)\n                    } else {\n                        queue[l.zIndex] = l;\n                    }\n                } else {\n                    out.push(l.apply(scope, args));\n                    if (stop) {\n                        break;\n                    }\n                }\n            }\n            stop = oldstop;\n            current_event = ce;\n            return out.length ? out : null;\n        };\n\t\t// Undocumented. Debug only.\n\t\teve._events = events;\n    /*\\\n     * eve.listeners\n     [ method ]\n\n     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n     > Arguments\n\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n     = (array) array of event handlers\n    \\*/\n    eve.listeners = function (name) {\n        var names = name.split(separator),\n            e = events,\n            item,\n            items,\n            k,\n            i,\n            ii,\n            j,\n            jj,\n            nes,\n            es = [e],\n            out = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            nes = [];\n            for (j = 0, jj = es.length; j < jj; j++) {\n                e = es[j].n;\n                items = [e[names[i]], e[wildcard]];\n                k = 2;\n                while (k--) {\n                    item = items[k];\n                    if (item) {\n                        nes.push(item);\n                        out = out.concat(item.f || []);\n                    }\n                }\n            }\n            es = nes;\n        }\n        return out;\n    };\n    \n    /*\\\n     * eve.on\n     [ method ]\n     **\n     * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n     | eve.on(\"*.under.*\", f);\n     | eve(\"mouse.under.floor\"); // triggers f\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n     > Example:\n     | eve.on(\"mouse\", eatIt)(2);\n     | eve.on(\"mouse\", scream);\n     | eve.on(\"mouse\", catchIt)(1);\n     * This will ensure that `catchIt()` function will be called before `eatIt()`.\n\t *\n     * If you want to put your handler before non-indexed handlers, specify a negative value.\n     * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n    \\*/\n    eve.on = function (name, f) {\n\t\tname = String(name);\n\t\tif (typeof f != \"function\") {\n\t\t\treturn function () {};\n\t\t}\n        var names = name.split(separator),\n            e = events;\n        for (var i = 0, ii = names.length; i < ii; i++) {\n            e = e.n;\n            e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n        }\n        e.f = e.f || [];\n        for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n            return fun;\n        }\n        e.f.push(f);\n        return function (zIndex) {\n            if (+zIndex == +zIndex) {\n                f.zIndex = +zIndex;\n            }\n        };\n    };\n    /*\\\n     * eve.f\n     [ method ]\n     **\n     * Returns function that will fire given event with optional arguments.\n\t * Arguments that will be passed to the result function will be also\n\t * concated to the list of final arguments.\n \t | el.onclick = eve.f(\"click\", 1, 2);\n \t | eve.on(\"click\", function (a, b, c) {\n \t |     console.log(a, b, c); // 1, 2, [event object]\n \t | });\n     > Arguments\n\t - event (string) event name\n\t - varargs (…) and any other arguments\n\t = (function) possible event handler function\n    \\*/\n\teve.f = function (event) {\n\t\tvar attrs = [].slice.call(arguments, 1);\n\t\treturn function () {\n\t\t\teve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n\t\t};\n\t};\n    /*\\\n     * eve.stop\n     [ method ]\n     **\n     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n    \\*/\n    eve.stop = function () {\n        stop = 1;\n    };\n    /*\\\n     * eve.nt\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     > Arguments\n     **\n     - subname (string) #optional subname of the event\n     **\n     = (string) name of the event, if `subname` is not specified\n     * or\n     = (boolean) `true`, if current event’s name contains `subname`\n    \\*/\n    eve.nt = function (subname) {\n        if (subname) {\n            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(current_event);\n        }\n        return current_event;\n    };\n    /*\\\n     * eve.nts\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     **\n     = (array) names of the event\n    \\*/\n    eve.nts = function () {\n        return current_event.split(separator);\n    };\n    /*\\\n     * eve.off\n     [ method ]\n     **\n     * Removes given function from the list of event listeners assigned to given name.\n\t * If no arguments specified all the events will be cleared.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n    \\*/\n    /*\\\n     * eve.unbind\n     [ method ]\n     **\n     * See @eve.off\n    \\*/\n    eve.off = eve.unbind = function (name, f) {\n\t\tif (!name) {\n\t\t    eve._events = events = {n: {}};\n\t\t\treturn;\n\t\t}\n        var names = name.split(separator),\n            e,\n            key,\n            splice,\n            i, ii, j, jj,\n            cur = [events];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            for (j = 0; j < cur.length; j += splice.length - 2) {\n                splice = [j, 1];\n                e = cur[j].n;\n                if (names[i] != wildcard) {\n                    if (e[names[i]]) {\n                        splice.push(e[names[i]]);\n                    }\n                } else {\n                    for (key in e) if (e[has](key)) {\n                        splice.push(e[key]);\n                    }\n                }\n                cur.splice.apply(cur, splice);\n            }\n        }\n        for (i = 0, ii = cur.length; i < ii; i++) {\n            e = cur[i];\n            while (e.n) {\n                if (f) {\n                    if (e.f) {\n                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n                            e.f.splice(j, 1);\n                            break;\n                        }\n                        !e.f.length && delete e.f;\n                    }\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        var funcs = e.n[key].f;\n                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n                            funcs.splice(j, 1);\n                            break;\n                        }\n                        !funcs.length && delete e.n[key].f;\n                    }\n                } else {\n                    delete e.f;\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        delete e.n[key].f;\n                    }\n                }\n                e = e.n;\n            }\n        }\n    };\n    /*\\\n     * eve.once\n     [ method ]\n     **\n     * Binds given event handler with a given name to only run once then unbind itself.\n     | eve.once(\"login\", f);\n     | eve(\"login\"); // triggers f\n     | eve(\"login\"); // no listeners\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) same return function as @eve.on\n    \\*/\n    eve.once = function (name, f) {\n        var f2 = function () {\n            eve.unbind(name, f2);\n            return f.apply(this, arguments);\n        };\n        return eve.on(name, f2);\n    };\n    /*\\\n     * eve.version\n     [ property (string) ]\n     **\n     * Current version of the library.\n    \\*/\n    eve.version = version;\n    eve.toString = function () {\n        return \"You are running Eve \" + version;\n    };\n    (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : (typeof define != \"undefined\" ? (define(\"eve\", [], function() { return eve; })) : (glob.eve = eve));\n})(this);\n\n(function (glob, factory) {\n    // AMD support\n    if (typeof define === \"function\" && define.amd) {\n        // Define as an anonymous module\n        define([\"eve\"], function( eve ) {\n            return factory(glob, eve);\n        });\n    } else {\n        // Browser globals (glob is window)\n        // Snap adds itself to window\n        factory(glob, glob.eve);\n    }\n}(this, function (window, eve) {\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n    var animations = {},\n    requestAnimFrame = window.requestAnimationFrame       ||\n                       window.webkitRequestAnimationFrame ||\n                       window.mozRequestAnimationFrame    ||\n                       window.oRequestAnimationFrame      ||\n                       window.msRequestAnimationFrame     ||\n                       function (callback) {\n                           setTimeout(callback, 16);\n                       },\n    isArray = Array.isArray || function (a) {\n        return a instanceof Array ||\n            Object.prototype.toString.call(a) == \"[object Array]\";\n    },\n    idgen = 0,\n    idprefix = \"M\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    diff = function (a, b, A, B) {\n        if (isArray(a)) {\n            res = [];\n            for (var i = 0, ii = a.length; i < ii; i++) {\n                res[i] = diff(a[i], b, A[i], B);\n            }\n            return res;\n        }\n        var dif = (A - a) / (B - b);\n        return function (bb) {\n            return a + dif * (bb - b);\n        };\n    },\n    timer = function () {\n        return +new Date;\n    },\n    sta = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.s;\n        }\n        var ds = a.s - val;\n        a.b += a.dur * ds;\n        a.B += a.dur * ds;\n        a.s = val;\n    },\n    speed = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.spd;\n        }\n        a.spd = val;\n    },\n    duration = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.dur;\n        }\n        a.s = a.s * val / a.dur;\n        a.dur = val;\n    },\n    stopit = function () {\n        var a = this;\n        delete animations[a.id];\n        eve(\"mina.stop.\" + a.id, a);\n    },\n    pause = function () {\n        var a = this;\n        if (a.pdif) {\n            return;\n        }\n        delete animations[a.id];\n        a.pdif = a.get() - a.b;\n    },\n    resume = function () {\n        var a = this;\n        if (!a.pdif) {\n            return;\n        }\n        a.b = a.get() - a.pdif;\n        delete a.pdif;\n        animations[a.id] = a;\n    },\n    frame = function () {\n        var len = 0;\n        for (var i in animations) if (animations.hasOwnProperty(i)) {\n            var a = animations[i],\n                b = a.get(),\n                res;\n            len++;\n            a.s = (b - a.b) / (a.dur / a.spd);\n            if (a.s >= 1) {\n                delete animations[i];\n                a.s = 1;\n                len--;\n            }\n            if (isArray(a.start)) {\n                res = [];\n                for (var j = 0, jj = a.start.length; j < jj; j++) {\n                    res[j] = a.start[j] +\n                        (a.end[j] - a.start[j]) * a.easing(a.s);\n                }\n            } else {\n                res = a.start + (a.end - a.start) * a.easing(a.s);\n            }\n            a.set(res);\n            if (a.s == 1) {\n                eve(\"mina.finish.\" + a.id, a);\n            }\n        }\n        len && requestAnimFrame(frame);\n    },\n    // SIERRA Unfamiliar with the word _slave_ in this context. Also, I don't know what _gereal_ means. Do you mean _general_?\n    /*\\\n     * mina\n     [ method ]\n     **\n     * Generic animation of numbers\n     **\n     - a (number) start _slave_ number\n     - A (number) end _slave_ number\n     - b (number) start _master_ number (start time in gereal case)\n     - B (number) end _master_ number (end time in gereal case)\n     - get (function) getter of _master_ number (see @mina.time)\n     - set (function) setter of _slave_ number\n     - easing (function) #optional easing function, default is @mina.linear\n     = (object) animation descriptor\n     o {\n     o         id (string) animation id,\n     o         start (number) start _slave_ number,\n     o         end (number) end _slave_ number,\n     o         b (number) start _master_ number,\n     o         s (number) animation status (0..1),\n     o         dur (number) animation duration,\n     o         spd (number) animation speed,\n     o         get (function) getter of _master_ number (see @mina.time),\n     o         set (function) setter of _slave_ number,\n     o         easing (function) easing function, default is @mina.linear,\n     o         status (function) status getter/setter,\n     o         speed (function) speed getter/setter,\n     o         duration (function) duration getter/setter,\n     o         stop (function) animation stopper\n     o }\n    \\*/\n    mina = function (a, A, b, B, get, set, easing) {\n        var anim = {\n            id: ID(),\n            start: a,\n            end: A,\n            b: b,\n            s: 0,\n            dur: B - b,\n            spd: 1,\n            get: get,\n            set: set,\n            easing: easing || mina.linear,\n            status: sta,\n            speed: speed,\n            duration: duration,\n            stop: stopit,\n            pause: pause,\n            resume: resume\n        };\n        animations[anim.id] = anim;\n        var len = 0, i;\n        for (i in animations) if (animations.hasOwnProperty(i)) {\n            len++;\n            if (len == 2) {\n                break;\n            }\n        }\n        len == 1 && requestAnimFrame(frame);\n        return anim;\n    };\n    /*\\\n     * mina.time\n     [ method ]\n     **\n     * Returns the current time. Equivalent to:\n     | function () {\n     |     return (new Date).getTime();\n     | }\n    \\*/\n    mina.time = timer;\n    /*\\\n     * mina.getById\n     [ method ]\n     **\n     * Returns an animation by its id\n     - id (string) animation's id\n     = (object) See @mina\n    \\*/\n    mina.getById = function (id) {\n        return animations[id] || null;\n    };\n\n    /*\\\n     * mina.linear\n     [ method ]\n     **\n     * Default linear easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.linear = function (n) {\n        return n;\n    };\n    /*\\\n     * mina.easeout\n     [ method ]\n     **\n     * Easeout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeout = function (n) {\n        return Math.pow(n, 1.7);\n    };\n    /*\\\n     * mina.easein\n     [ method ]\n     **\n     * Easein easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easein = function (n) {\n        return Math.pow(n, .48);\n    };\n    /*\\\n     * mina.easeinout\n     [ method ]\n     **\n     * Easeinout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeinout = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        if (n == 0) {\n            return 0;\n        }\n        var q = .48 - n / 1.04,\n            Q = Math.sqrt(.1734 + q * q),\n            x = Q - q,\n            X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n            y = -Q - q,\n            Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n            t = X + Y + .5;\n        return (1 - t) * 3 * t * t + t * t * t;\n    };\n    /*\\\n     * mina.backin\n     [ method ]\n     **\n     * Backin easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backin = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        var s = 1.70158;\n        return n * n * ((s + 1) * n - s);\n    };\n    /*\\\n     * mina.backout\n     [ method ]\n     **\n     * Backout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backout = function (n) {\n        if (n == 0) {\n            return 0;\n        }\n        n = n - 1;\n        var s = 1.70158;\n        return n * n * ((s + 1) * n + s) + 1;\n    };\n    /*\\\n     * mina.elastic\n     [ method ]\n     **\n     * Elastic easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.elastic = function (n) {\n        if (n == !!n) {\n            return n;\n        }\n        return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n            (2 * Math.PI) / .3) + 1;\n    };\n    /*\\\n     * mina.bounce\n     [ method ]\n     **\n     * Bounce easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.bounce = function (n) {\n        var s = 7.5625,\n            p = 2.75,\n            l;\n        if (n < (1 / p)) {\n            l = s * n * n;\n        } else {\n            if (n < (2 / p)) {\n                n -= (1.5 / p);\n                l = s * n * n + .75;\n            } else {\n                if (n < (2.5 / p)) {\n                    n -= (2.25 / p);\n                    l = s * n * n + .9375;\n                } else {\n                    n -= (2.625 / p);\n                    l = s * n * n + .984375;\n                }\n            }\n        }\n        return l;\n    };\n    window.mina = mina;\n    return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n/*\n * Elemental 0.2.4 - Simple JavaScript Tag Parser\n *\n * Copyright (c) 2010 - 2013 Dmitry Baranovskiy (http://dmitry.baranovskiy.com/)\n * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.\n */\n \n(function () {\n    function parse(s) {\n        s = s || Object(s);\n        var pos = 1,\n            len = s.length + 1,\n            p, c, n = at(s, 0);\n        for (;pos < len; pos++) {\n            p = c;\n            c = n;\n            n = at(s, pos);\n            this.raw += c;\n            step.call(this, c, n, p);\n        }\n        this._beforeEnd = function () {\n            step.call(this, \"\", \"\", c);\n        };\n        return this;\n    }\n\n    function at(s, i) {\n        return s && (s.charAt ? s.charAt(i) : s[i]);\n    }\n\n    function on(name, f) {\n        this.events = this.events || {};\n        this.events[name] = this.events[name] || [];\n        this.events[name].push(f);\n    }\n\n    function event(name, data, extra) {\n        if (typeof eve == \"function\") {\n            eve(\"elemental.\" + name + (data ? \".\" + data : \"\"), null, data, extra || \"\", this.raw);\n        }\n        var a = this.events && this.events[name],\n            i = a && a.length;\n        while (i--) try {\n            this.events[name][i](data, extra || \"\", this.raw);\n        } catch (e) {}\n        this.raw = \"\";\n    }\n\n    function end() {\n        step.call(this, \"eof\");\n        this.event(\"eof\");\n    }\n\n    var entities = {\n            \"lt\": 60,\n            \"lt;\": 60,\n            \"AMP;\": 38,\n            \"AMP\": 38,\n            \"GT;\": 62,\n            \"GT\": 62,\n            \"QUOT;\": 34,\n            \"QUOT\": 34,\n            \"apos;\": 39,\n            \"bull;\": 8226,\n            \"bullet;\": 8226,\n            \"copy;\": 169,\n            \"copy\": 169,\n            \"deg;\": 176,\n            \"deg\": 176\n        },\n        whitespace = /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000]/,\n        notEntity = /[#\\da-z]/i,\n        entity2text = function (entity) {\n            var code;\n            if (entity.charAt() == \"#\") {\n                if (entity.charAt(1).toLowerCase() == \"x\") {\n                    code = parseInt(entity.substring(2), 16);\n                } else {\n                    code = parseInt(entity.substring(1), 10);\n                }\n            }\n            code = entities[entity];\n            return code ? String.fromCharCode(code) : (\"&\" + entity);\n        },\n        fireAttrEvent = function () {\n            for (var key in this.attr) if (this.attr.hasOwnProperty(key)) {\n                this.event(\"attr\", key, {\n                    value: this.attr[key],\n                    tagname: this.tagname,\n                    attr: this.attr\n                });\n            }\n        },\n        act = {\n            text: function (c, n, p) {\n                switch (c) {\n                    case \"<\":\n                    case \"eof\":\n                        this.nodename = \"\";\n                        this.attr = {};\n                        this.mode = \"tag name start\";\n                        this.raw = this.raw.slice(0, -1);\n                        this.textchunk && this.event(\"text\", this.textchunk);\n                        this.raw += c;\n                        this.textchunk = \"\";\n                    break;\n                    case \"&\":\n                        this.mode = \"entity\";\n                        this.entity = \"\";\n                    break;\n                    default:\n                        this.textchunk += c;\n                    break;\n                }\n            },\n            entity: function (c, n, p) {\n                if (whitespace.test(c)) {\n                    this.textchunk += entity2text(this.entity);\n                    this.mode = \"text\";\n                } else if (c == \";\") {\n                    this.textchunk += entity2text(this.entity + c);\n                    this.mode = \"text\";\n                } else {\n                    this.entity += c;\n                }\n            },\n            special: function (c, n, p) {\n                if (p == \"!\" && c == \"-\" && n == \"-\") {\n                    this.mode = \"comment start\";\n                    return;\n                }\n                if (this.textchunk == \"[CDATA\" && c == \"[\") {\n                    this.mode = \"cdata\";\n                    this.textchunk = \"\";\n                    return;\n                }\n                if (c == \">\" || c == \"eof\") {\n                    this.event(\"special\", this.textchunk);\n                    this.mode = \"text\";\n                    this.textchunk = \"\";\n                    return;\n                }\n                this.textchunk += c;\n            },\n            cdata: function (c, n, p) {\n                if (p == \"]\" && c == \"]\" && n == \">\") {\n                    this.mode = \"cdata end\";\n                    this.textchunk = this.textchunk.slice(0, -1);\n                    return;\n                }\n                if (c == \"eof\") {\n                    act[\"cdata end\"].call(this);\n                }\n                this.textchunk += c;\n            },\n            \"cdata end\": function (c, n, p) {\n                this.event(\"cdata\", this.textchunk);\n                this.textchunk = \"\";\n                this.mode = \"text\";\n            },\n            \"comment start\": function (c, n, p) {\n                if (n == \">\" || c == \"eof\") {\n                    this.event(\"comment\", \"\");\n                    this.mode = \"skip\";\n                } else {\n                    this.mode = \"comment\";\n                }\n            },\n            \"skip\": function (c, n, p) {\n                this.mode = \"text\";\n            },\n            comment: function (c, n, p) {\n                if (c == \"-\" && p == \"-\" && n == \">\") {\n                    this.mode = \"comment end\";\n                    this.textchunk = this.textchunk.slice(0, -1);\n                } else if (c == \"eof\") {\n                    this.event(\"comment\", this.textchunk);\n                } else {\n                    this.textchunk += c;\n                }\n            },\n            \"comment end\": function (c, n, p) {\n                this.event(\"comment\", this.textchunk);\n                this.textchunk = \"\";\n                this.mode = \"text\";\n            },\n            declaration: function (c, n, p) {\n                if (c == \"?\" && n == \">\") {\n                    this.mode = \"declaration end\";\n                    return;\n                }\n                if (c == \"eof\") {\n                    this.event(\"comment\", this.textchunk);\n                }\n                this.textchunk += c;\n            },\n            \"declaration end\": function (c, n, p) {\n                this.event(\"comment\", this.textchunk);\n                this.textchunk = \"\";\n                this.mode = \"text\";\n            },\n            \"tag name start\": function (c, n, p) {\n                if (c == \"eof\") {\n                    this.event(\"text\", \"<\");\n                    return;\n                }\n                if (!whitespace.test(c)) {\n                    this.mode = \"tag name\";\n                    if (c == \"/\") {\n                        this.mode = \"close tag name start\";\n                        return;\n                    } else if (c == \"!\") {\n                        this.mode = \"special\";\n                        this.textchunk = \"\";\n                        return;\n                    } else if (c == \"?\") {\n                        this.mode = \"declaration\";\n                        return;\n                    }\n                    act[this.mode].call(this, c, n, p);\n                }\n            },\n            \"close tag name start\": function (c, n, p) {\n                if (!whitespace.test(c)) {\n                    this.mode = \"close tag name\";\n                    this.tagname = \"\";\n                    this.nodename = \"\";\n                    act[this.mode].call(this, c, n, p);\n                }\n            },\n            \"close tag name\": function (c, n, p) {\n                if (whitespace.test(c)) {\n                    this.tagname = this.nodename;\n                } else switch (c) {\n                    case \">\":\n                        this.event(\"/tag\", (this.tagname || this.nodename));\n                        this.mode = \"text\";\n                    break;\n                    default:\n                        !this.tagname && (this.nodename += c);\n                    break;\n                }\n            },\n            \"tag name\": function (c, n, p) {\n                if (whitespace.test(c)) {\n                    this.tagname = this.nodename;\n                    this.nodename = \"\";\n                    this.mode = \"attr start\";\n                } else switch (c) {\n                    case \">\":\n                        this.event(\"tag\", this.nodename);\n                        this.mode = \"text\";\n                    break;\n                    case \"/\":\n                        this.raw += n;\n                        this.event(\"tag\", this.nodename);\n                        this.event(\"/tag\", this.nodename);\n                        this.mode = \"skip\";\n                    break;\n                    default:\n                        this.nodename += c;\n                    break;\n                }\n            },\n            \"attr start\": function (c, n, p) {\n                if (!whitespace.test(c)) {\n                    this.mode = \"attr\";\n                    this.nodename = \"\";\n                    act[this.mode].call(this, c, n, p);\n                }\n            },\n            attr: function (c, n, p) {\n                if (whitespace.test(c) || c == \"=\") {\n                    this.attr[this.nodename] = \"\";\n                    this.mode = \"attr value start\";\n                } else switch (c) {\n                    case \">\":\n                        if (this.nodename == \"/\") {\n                            delete this.attr[\"/\"];\n                            this.event(\"tag\", this.tagname, this.attr);\n                            fireAttrEvent.call(this);\n                            this.event(\"/tag\", this.tagname, true);\n                        } else {\n                            this.nodename && (this.attr[this.nodename] = \"\");\n                            this.event(\"tag\", this.tagname, this.attr);\n                            fireAttrEvent.call(this);\n                        }\n                        this.mode = \"text\";\n                    break;\n                    default:\n                        this.nodename += c;\n                    break;\n                }\n            },\n            \"attr value start\": function (c, n, p) {\n                if (!whitespace.test(c)) {\n                    this.mode = \"attr value\";\n                    this.quote = false;\n                    if (c == \"'\" || c == '\"') {\n                        this.quote = c;\n                        return;\n                    }\n                    act[this.mode].call(this, c, n, p);\n                }\n            },\n            \"attr value\": function (c, n, p) {\n                if (whitespace.test(c) && !this.quote) {\n                    this.mode = \"attr start\";\n                } else if (c == \">\" && !this.quote) {\n                    this.event(\"tag\", this.tagname, this.attr);\n                    this.mode = \"text\";\n                } else switch (c) {\n                    case '\"':\n                    case \"'\":\n                        if (this.quote == c && p != \"\\\\\") {\n                            this.mode = \"attr start\";\n                        }\n                    break;\n                    default:\n                        this.attr[this.nodename] += c;\n                    break;\n                }\n            }\n        };\n\n    function step(c, n, p) {\n        c == \"\\n\" && this.event(\"newline\");\n        act[this.mode].call(this, c, n, p);\n    }\n\n    function elemental(type, ent) {\n        var out = function (s) {\n            out.parse(s);\n        };\n        out.mode = \"text\";\n        out.type = String(type || \"html\").toLowerCase();\n        out.textchunk = \"\";\n        out.raw = \"\";\n        out.parse = parse;\n        out.on = on;\n        out.event = event;\n        out.end = end;\n        if (ent) {\n            entities = ent;\n        }\n        return out;\n    }\n    elemental.version = \"0.2.4\";\n\n    (typeof exports == \"undefined\" ? this : exports).elemental = elemental;\n})();\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function() {\nSnap.version = \"0.1.0\";\n// SIERRA: this method appears to be missing from HTML output\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n    if (w) {\n        if (w.tagName) {\n            return wrap(w);\n        }\n        if (w instanceof Element) {\n            return w;\n        }\n        if (h == null) {\n            w = glob.doc.querySelector(w);\n            return wrap(w);\n        }\n    }\n    w = w == null ? \"100%\" : w;\n    h = h == null ? \"100%\" : h;\n    return new Paper(w, h);\n}\nSnap.toString = function () {\n    return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n    win: window,\n    doc: window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n    Str = String,\n    toFloat = parseFloat,\n    toInt = parseInt,\n    math = Math,\n    mmax = math.max,\n    mmin = math.min,\n    abs = math.abs,\n    pow = math.pow,\n    PI = math.PI,\n    round = math.round,\n    E = \"\",\n    S = \" \",\n    objectToString = Object.prototype.toString,\n    ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n    colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n    isnan = {\"NaN\": 1, \"Infinity\": 1, \"-Infinity\": 1},\n    bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n    reURLValue = /^url\\(#?([^)]+)\\)$/,\n    spaces = \"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\",\n    separator = new RegExp(\"[,\" + spaces + \"]+\"),\n    whitespace = new RegExp(\"[\" + spaces + \"]\", \"g\"),\n    commaSpaces = new RegExp(\"[\" + spaces + \"]*,[\" + spaces + \"]*\"),\n    hsrg = {hs: 1, rg: 1},\n    pathCommand = new RegExp(\"([a-z])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    tCommand = new RegExp(\"([rstm])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    pathValues = new RegExp(\"(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\" + spaces + \"]*,?[\" + spaces + \"]*\", \"ig\"),\n    idgen = 0,\n    idprefix = \"S\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    xlink = \"http://www.w3.org/1999/xlink\",\n    hub = {};\n\nfunction $(el, attr) {\n    if (attr) {\n        if (typeof el == \"string\") {\n            el = $(el);\n        }\n        if (typeof attr == \"string\") {\n            if (attr.substring(0, 6) == \"xlink:\") {\n                return el.getAttributeNS(xlink, attr.substring(6));\n            }\n            return el.getAttribute(attr);\n        }\n        for (var key in attr) if (attr[has](key)) {\n            var val = Str(attr[key]);\n            if (val) {\n                if (key.substring(0, 6) == \"xlink:\") {\n                    el.setAttributeNS(xlink, key.substring(6), val);\n                } else {\n                    el.setAttribute(key, val);\n                }\n            } else {\n                el.removeAttribute(key);\n            }\n        }\n    } else {\n        el = glob.doc.createElementNS(\"http://www.w3.org/2000/svg\", el);\n        // el.style && (el.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\");\n    }\n    return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n    var attrs = el.attributes,\n        name,\n        out = {};\n    for (var i = 0; i < attrs.length; i++) {\n        if (attrs[i].namespaceURI == xlink) {\n            name = \"xlink:\";\n        } else {\n            name = \"\";\n        }\n        name += attrs[i].name;\n        out[name] = attrs[i].textContent;\n    }\n    return out;\n}\nfunction is(o, type) {\n    type = Str.prototype.toLowerCase.call(type);\n    if (type == \"finite\") {\n        return !isnan[has](+o);\n    }\n    if (type == \"array\" &&\n        (o instanceof Array || Array.isArray && Array.isArray(o))) {\n        return true;\n    }\n    return  (type == \"null\" && o === null) ||\n            (type == typeof o && o !== null) ||\n            (type == \"object\" && o === Object(o)) ||\n            objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{<name>}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n |     x: 10,\n |     y: 20,\n |     dim: {\n |         width: 40,\n |         height: 50,\n |         \"negative width\": -40\n |     }\n | }));\n\\*/\nSnap.format = (function () {\n    var tokenRegex = /\\{([^\\}]+)\\}/g,\n        objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n        replacer = function (all, key, obj) {\n            var res = obj;\n            key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                name = name || quotedName;\n                if (res) {\n                    if (name in res) {\n                        res = res[name];\n                    }\n                    typeof res == \"function\" && isFunc && (res = res());\n                }\n            });\n            res = (res == null || res == obj ? all : res) + \"\";\n            return res;\n        };\n    return function (str, obj) {\n        return Str(str).replace(tokenRegex, function (all, key) {\n            return replacer(all, key, obj);\n        });\n    };\n})();\nvar preload = (function () {\n    function onerror() {\n        this.parentNode.removeChild(this);\n    }\n    return function (src, f) {\n        var img = glob.doc.createElement(\"img\"),\n            body = glob.doc.body;\n        img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n        img.onload = function () {\n            f.call(img);\n            img.onload = img.onerror = null;\n            body.removeChild(img);\n        };\n        img.onerror = onerror;\n        body.appendChild(img);\n        img.src = src;\n    };\n}());\nfunction clone(obj) {\n    if (typeof obj == \"function\" || Object(obj) !== obj) {\n        return obj;\n    }\n    var res = new obj.constructor;\n    for (var key in obj) if (obj[has](key)) {\n        res[key] = clone(obj[key]);\n    }\n    return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n        return array.push(array.splice(i, 1)[0]);\n    }\n}\nfunction cacher(f, scope, postprocessor) {\n    function newf() {\n        var arg = Array.prototype.slice.call(arguments, 0),\n            args = arg.join(\"\\u2400\"),\n            cache = newf.cache = newf.cache || {},\n            count = newf.count = newf.count || [];\n        if (cache[has](args)) {\n            repush(count, args);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        count.length >= 1e3 && delete cache[count.shift()];\n        count.push(args);\n        cache[args] = f.apply(scope, arg);\n        return postprocessor ? postprocessor(cache[args]) : cache[args];\n    }\n    return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n    if (x3 == null) {\n        var x = x1 - x2,\n            y = y1 - y2;\n        if (!x && !y) {\n            return 0;\n        }\n        return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n    } else {\n        return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n    }\n}\nfunction rad(deg) {\n    return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n    return rad * 180 / PI % 360;\n}\nfunction x_y() {\n    return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n    return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n// SIERRA for which point is the angle calculated?\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n > Parameters\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n    tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n    if (is(values, \"array\")) {\n        var i = values.length;\n        while (i--) if (abs(values[i] - value) <= tolerance) {\n            return values[i];\n        }\n    } else {\n        values = +values;\n        var rem = value % values;\n        if (rem < tolerance) {\n            return value - rem;\n        }\n        if (rem > values - tolerance) {\n            return value - rem + values;\n        }\n    }\n    return value;\n};\n\n// MATRIX\nfunction Matrix(a, b, c, d, e, f) {\n    if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n        this.a = a.a;\n        this.b = a.b;\n        this.c = a.c;\n        this.d = a.d;\n        this.e = a.e;\n        this.f = a.f;\n        return;\n    }\n    if (a != null) {\n        this.a = +a;\n        this.b = +b;\n        this.c = +c;\n        this.d = +d;\n        this.e = +e;\n        this.f = +f;\n    } else {\n        this.a = 1;\n        this.b = 0;\n        this.c = 0;\n        this.d = 1;\n        this.e = 0;\n        this.f = 0;\n    }\n}\n(function (matrixproto) {\n    /*\\\n     * Matrix.add\n     [ method ]\n     **\n     * Adds the given matrix to existing one\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     * or\n     - matrix (object) @Matrix\n    \\*/\n    matrixproto.add = function (a, b, c, d, e, f) {\n        var out = [[], [], []],\n            m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\n            matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\n            x, y, z, res;\n\n        if (a && a instanceof Matrix) {\n            matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\n        }\n\n        for (x = 0; x < 3; x++) {\n            for (y = 0; y < 3; y++) {\n                res = 0;\n                for (z = 0; z < 3; z++) {\n                    res += m[x][z] * matrix[z][y];\n                }\n                out[x][y] = res;\n            }\n        }\n        this.a = out[0][0];\n        this.b = out[1][0];\n        this.c = out[0][1];\n        this.d = out[1][1];\n        this.e = out[0][2];\n        this.f = out[1][2];\n        return this;\n    };\n// SIERRA Matrix.invert(): Unclear what it means to invert a matrix.\n    /*\\\n     * Matrix.invert\n     [ method ]\n     **\n     * Returns an inverted version of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.invert = function () {\n        var me = this,\n            x = me.a * me.d - me.b * me.c;\n        return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n    };\n    /*\\\n     * Matrix.clone\n     [ method ]\n     **\n     * Returns a copy of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.clone = function () {\n        return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n    };\n    /*\\\n     * Matrix.translate\n     [ method ]\n     **\n     * Translate the matrix\n     - x (number) horizontal offset distance\n     - y (number) vertical offset distance\n    \\*/\n    matrixproto.translate = function (x, y) {\n        return this.add(1, 0, 0, 1, x, y);\n    };\n    // SIERRA: do cx/cy default to the center point, as in CSS? If so, Snap appears to resolve important discrepancies between how transforms behave in SVG & CSS.\n    /*\\\n     * Matrix.scale\n     [ method ]\n     **\n     * Scales the matrix\n     - x (number) amount to be scaled, with `1` resulting in no change\n     - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n     - cx (number) #optional horizontal origin point from which to scale\n     - cy (number) #optional vertical origin point from which to scale\n    \\*/\n    matrixproto.scale = function (x, y, cx, cy) {\n        y == null && (y = x);\n        (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\n        this.add(x, 0, 0, y, 0, 0);\n        (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\n        return this;\n    };\n    /*\\\n     * Matrix.rotate\n     [ method ]\n     **\n     * Rotates the matrix\n     - a (number) angle of rotation, in degrees\n     - x (number) horizontal origin point from which to rotate\n     - y (number) vertical origin point from which to rotate\n    \\*/\n    matrixproto.rotate = function (a, x, y) {\n        a = rad(a);\n        x = x || 0;\n        y = y || 0;\n        var cos = +math.cos(a).toFixed(9),\n            sin = +math.sin(a).toFixed(9);\n        this.add(cos, sin, -sin, cos, x, y);\n        return this.add(1, 0, 0, 1, -x, -y);\n    };\n    /*\\\n     * Matrix.x\n     [ method ]\n     **\n     * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n     - x (number)\n     - y (number)\n     = (number) x\n    \\*/\n    matrixproto.x = function (x, y) {\n        return x * this.a + y * this.c + this.e;\n    };\n    /*\\\n     * Matrix.y\n     [ method ]\n     **\n     * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n     - x (number)\n     - y (number)\n     = (number) y\n    \\*/\n    matrixproto.y = function (x, y) {\n        return x * this.b + y * this.d + this.f;\n    };\n    matrixproto.get = function (i) {\n        return +this[Str.fromCharCode(97 + i)].toFixed(4);\n    };\n    matrixproto.toString = function () {\n        return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n    };\n    matrixproto.offset = function () {\n        return [this.e.toFixed(4), this.f.toFixed(4)];\n    };\n    function norm(a) {\n        return a[0] * a[0] + a[1] * a[1];\n    }\n    function normalize(a) {\n        var mag = math.sqrt(norm(a));\n        a[0] && (a[0] /= mag);\n        a[1] && (a[1] /= mag);\n    }\n// SIERRA Matrix.split(): HTML formatting for the return value is scrambled. It should appear _Returns: {OBJECT} in format:..._\n// SIERRA Matrix.split(): the _shear_ parameter needs to be detailed. Is it an angle? What does it affect?\n// SIERRA Matrix.split(): The idea of _simple_ transforms needs to be detailed and contrasted with any alternatives.\n    /*\\\n     * Matrix.split\n     [ method ]\n     **\n     * Splits matrix into primitive transformations\n     = (object) in format:\n     o dx (number) translation by x\n     o dy (number) translation by y\n     o scalex (number) scale by x\n     o scaley (number) scale by y\n     o shear (number) shear\n     o rotate (number) rotation in deg\n     o isSimple (boolean) could it be represented via simple transformations\n    \\*/\n    matrixproto.split = function () {\n        var out = {};\n        // translation\n        out.dx = this.e;\n        out.dy = this.f;\n\n        // scale and shear\n        var row = [[this.a, this.c], [this.b, this.d]];\n        out.scalex = math.sqrt(norm(row[0]));\n        normalize(row[0]);\n\n        out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n        row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n        out.scaley = math.sqrt(norm(row[1]));\n        normalize(row[1]);\n        out.shear /= out.scaley;\n\n        // rotation\n        var sin = -row[0][1],\n            cos = row[1][1];\n        if (cos < 0) {\n            out.rotate = deg(math.acos(cos));\n            if (sin < 0) {\n                out.rotate = 360 - out.rotate;\n            }\n        } else {\n            out.rotate = deg(math.asin(sin));\n        }\n\n        out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n        out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n        out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n        return out;\n    };\n// SIERRA Matrix.toTransformString(): The format of the string needs to be detailed.\n    /*\\\n     * Matrix.toTransformString\n     [ method ]\n     **\n     * Returns transform string that represents given matrix\n     = (string) transform string\n    \\*/\n    matrixproto.toTransformString = function (shorter) {\n        var s = shorter || this.split();\n        if (s.isSimple) {\n            s.scalex = +s.scalex.toFixed(4);\n            s.scaley = +s.scaley.toFixed(4);\n            s.rotate = +s.rotate.toFixed(4);\n            return  (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) + \n                    (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E) +\n                    (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E);\n        } else {\n            return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n        }\n    };\n})(Matrix.prototype);\n// SIERRA Unclear the difference between the two matrix formats (\"parameters\" vs svgMatrix). See my comment about Element.matrix().\n/*\\\n * Snap.Matrix\n [ method ]\n **\n * Utility method\n **\n * Returns a matrix based on the given parameters\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - svgMatrix (SVGMatrix)\n = (object) @Matrix\n\\*/\nSnap.Matrix = Matrix;\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n # <ul>\n #     <li>Color name (<code>red</code>, <code>green</code>, <code>cornflowerblue</code>, etc)</li>\n #     <li>#••• — shortened HTML color: (<code>#000</code>, <code>#fc0</code>, etc.)</li>\n #     <li>#•••••• — full length HTML color: (<code>#000000</code>, <code>#bd2300</code>)</li>\n #     <li>rgb(•••, •••, •••) — red, green and blue channels values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n #     <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n #     <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n #     <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsl(•••, •••, •••) — hue, saturation and luminosity values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n #     <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n # </ul>\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n    if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    if (colour == \"none\") {\n        return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n    }\n    !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n    if (!colour) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    var res,\n        red,\n        green,\n        blue,\n        opacity,\n        t,\n        values,\n        rgb = colour.match(colourRegExp);\n    if (rgb) {\n        if (rgb[2]) {\n            blue = toInt(rgb[2].substring(5), 16);\n            green = toInt(rgb[2].substring(3, 5), 16);\n            red = toInt(rgb[2].substring(1, 3), 16);\n        }\n        if (rgb[3]) {\n            blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n            green = toInt((t = rgb[3].charAt(2)) + t, 16);\n            red = toInt((t = rgb[3].charAt(1)) + t, 16);\n        }\n        if (rgb[4]) {\n            values = rgb[4].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red *= 2.55);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green *= 2.55);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue *= 2.55);\n            rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n        }\n        if (rgb[5]) {\n            values = rgb[5].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsb2rgb(red, green, blue, opacity);\n        }\n        if (rgb[6]) {\n            values = rgb[6].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsl2rgb(red, green, blue, opacity);\n        }\n        red = mmin(math.round(red), 255);\n        green = mmin(math.round(green), 255);\n        blue = mmin(math.round(blue), 255);\n        opacity = mmin(mmax(opacity, 0), 1);\n        rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n        rgb.hex = \"#\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\n        rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n        return rgb;\n    }\n    return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n// SIERRA It seems odd that the following 3 conversion methods are not expressed as .this2that(), like the others.\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n    return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n    return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n    if (is(o, \"finite\")) {\n        var round = math.round;\n        return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n    }\n    return \"#\" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);\n});\nvar toHex = function (color) {\n    var i = glob.doc.getElementsByTagName(\"head\")[0],\n        red = \"rgb(255, 0, 0)\";\n    toHex = cacher(function (color) {\n        if (color.toLowerCase() == \"red\") {\n            return red;\n        }\n        i.style.color = red;\n        i.style.color = color;\n        var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n        return out == red ? null : out;\n    });\n    return toHex(color);\n},\nhsbtoString = function () {\n    return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n    return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n    return this.opacity == 1 || this.opacity == null ?\n            this.hex :\n            \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n    if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n        b = r.b;\n        g = r.g;\n        r = r.r;\n    }\n    if (g == null && is(r, string)) {\n        var clr = Snap.getRGB(r);\n        r = clr.r;\n        g = clr.g;\n        b = clr.b;\n    }\n    if (r > 1 || g > 1 || b > 1) {\n        r /= 255;\n        g /= 255;\n        b /= 255;\n    }\n    \n    return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n    r = math.round(r * 255);\n    g = math.round(g * 255);\n    b = math.round(b * 255);\n    var rgb = {\n        r: r,\n        g: g,\n        b: b,\n        opacity: is(o, \"finite\") ? o : 1,\n        hex: Snap.rgb(r, g, b),\n        toString: rgbtoString\n    };\n    is(o, \"finite\") && (rgb.opacity = o);\n    return rgb;\n};\n// SIERRA Clarify if Snap does not support consolidated HSLA/RGBA colors. E.g., can you specify a semi-transparent value for Snap.filter.shadow()?\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) `true` if string can't be parsed,\n o     h (number) hue,\n o     s (number) saturation,\n o     v (number) value (brightness),\n o     l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n    var rgb;\n    if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n        rgb = Snap.hsb2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n        rgb = Snap.hsl2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else {\n        if (is(clr, \"string\")) {\n            clr = Snap.getRGB(clr);\n        }\n        if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n            rgb = Snap.rgb2hsl(clr);\n            clr.h = rgb.h;\n            clr.s = rgb.s;\n            clr.l = rgb.l;\n            rgb = Snap.rgb2hsb(clr);\n            clr.v = rgb.b;\n        } else {\n            clr = {hex: \"none\"};\n            clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            clr.error = 1;\n        }\n    }\n    clr.toString = rgbtoString;\n    return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n        v = h.b;\n        s = h.s;\n        h = h.h;\n        o = h.o;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = v * s;\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = v - C;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n        l = h.l;\n        s = h.s;\n        h = h.h;\n    }\n    if (h > 1 || s > 1 || l > 1) {\n        h /= 360;\n        s /= 100;\n        l /= 100;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = 2 * s * (l < .5 ? l : 1 - l);\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = l - C / 2;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, V, C;\n    V = mmax(r, g, b);\n    C = V - mmin(r, g, b);\n    H = (C == 0 ? null :\n         V == r ? (g - b) / C :\n         V == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4\n        );\n    H = ((H + 360) % 6) * 60 / 360;\n    S = C == 0 ? 0 : C / V;\n    return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, L, M, m, C;\n    M = mmax(r, g, b);\n    m = mmin(r, g, b);\n    C = M - m;\n    H = (C == 0 ? null :\n         M == r ? (g - b) / C :\n         M == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4);\n    H = ((H + 360) % 6) * 60 / 360;\n    L = (M + m) / 2;\n    S = (C == 0 ? 0 :\n         L < .5 ? C / (2 * L) :\n                  C / (2 - 2 * L));\n    return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n// SIERRA Snap.parsePathString(): By _array of arrays,_ I assume you mean a format like this for two separate segments? [ [\"M10,10\",\"L90,90\"], [\"M90,10\",\"L10,90\"] ] Otherwise how is each command structured?\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n    if (!pathString) {\n        return null;\n    }\n    var pth = Snap.path(pathString);\n    if (pth.arr) {\n        return Snap.path.clone(pth.arr);\n    }\n    \n    var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n        data = [];\n    if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(pathString);\n    }\n    if (!data.length) {\n        Str(pathString).replace(pathCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            if (name == \"m\" && params.length > 2) {\n                data.push([b].concat(params.splice(0, 2)));\n                name = \"l\";\n                b = b == \"m\" ? \"l\" : \"L\";\n            }\n            if (name == \"o\" && params.length == 1) {\n                data.push([b, params[0]]);\n            }\n            if (name == \"r\") {\n                data.push([b].concat(params));\n            } else while (params.length >= paramCounts[name]) {\n                data.push([b].concat(params.splice(0, paramCounts[name])));\n                if (!paramCounts[name]) {\n                    break;\n                }\n            }\n        });\n    }\n    data.toString = Snap.path.toString;\n    pth.arr = Snap.path.clone(data);\n    return data;\n};\n// SIERRA Snap.parseTransformString(): I don't understand the string format.\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n    if (!TString) {\n        return null;\n    }\n    var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n        data = [];\n    if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(TString);\n    }\n    if (!data.length) {\n        Str(TString).replace(tCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            data.push([b].concat(params));\n        });\n    }\n    data.toString = Snap.path.toString;\n    return data;\n};\nfunction svgTransform2string(tstr) {\n    var res = [];\n    tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n        params = params.split(/\\s*,\\s*/);\n        if (name == \"rotate\" && params.length == 1) {\n            params.push(0, 0);\n        }\n        if (name == \"scale\") {\n            if (params.length == 2) {\n                params.push(0, 0);\n            }\n            if (params.length == 1) {\n                params.push(params[0], 0, 0);\n            }\n        }\n        if (name == \"skewX\") {\n            res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n        } else if (name == \"skewY\") {\n            res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n        } else {\n            res.push([name.charAt(0)].concat(params));\n        }\n        return all;\n    });\n    return res;\n}\nvar rgTransform = new RegExp(\"^[a-z][\" + spaces + \"]*-?\\\\.?\\\\d\");\nfunction transform2matrix(tstr, bbox) {\n    var tdata = parseTransformString(tstr),\n        deg = 0,\n        dx = 0,\n        dy = 0,\n        sx = 1,\n        sy = 1,\n        m = new Matrix;\n    if (tdata) {\n        for (var i = 0, ii = tdata.length; i < ii; i++) {\n            var t = tdata[i],\n                tlen = t.length,\n                command = Str(t[0]).toLowerCase(),\n                absolute = t[0] != command,\n                inver = absolute ? m.invert() : 0,\n                x1,\n                y1,\n                x2,\n                y2,\n                bb;\n            if (command == \"t\" && tlen == 3) {\n                if (absolute) {\n                    x1 = inver.x(0, 0);\n                    y1 = inver.y(0, 0);\n                    x2 = inver.x(t[1], t[2]);\n                    y2 = inver.y(t[1], t[2]);\n                    m.translate(x2 - x1, y2 - y1);\n                } else {\n                    m.translate(t[1], t[2]);\n                }\n            } else if (command == \"r\") {\n                if (tlen == 2) {\n                    bb = bb || bbox;\n                    m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                    deg += t[1];\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.rotate(t[1], x2, y2);\n                    } else {\n                        m.rotate(t[1], t[2], t[3]);\n                    }\n                    deg += t[1];\n                }\n            } else if (command == \"s\") {\n                if (tlen == 2 || tlen == 3) {\n                    bb = bb || bbox;\n                    m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                    sx *= t[1];\n                    sy *= t[tlen - 1];\n                } else if (tlen == 5) {\n                    if (absolute) {\n                        x2 = inver.x(t[3], t[4]);\n                        y2 = inver.y(t[3], t[4]);\n                        m.scale(t[1], t[2], x2, y2);\n                    } else {\n                        m.scale(t[1], t[2], t[3], t[4]);\n                    }\n                    sx *= t[1];\n                    sy *= t[2];\n                }\n            } else if (command == \"m\" && tlen == 7) {\n                m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n            }\n        }\n    }\n    return m;\n}\nSnap._.transform2matrix = transform2matrix;\nfunction extractTransform(el, tstr) {\n    if (tstr == null) {\n        var doReturn = true;\n        if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n            tstr = el.node.getAttribute(\"gradientTransform\");\n        } else if (el.type == \"pattern\") {\n            tstr = el.node.getAttribute(\"patternTransform\");\n        } else {\n            tstr = el.node.getAttribute(\"transform\");\n        }\n        if (!tstr) {\n            return new Matrix;\n        }\n        tstr = svgTransform2string(tstr);\n    } else if (!rgTransform.test(tstr)) {\n        tstr = svgTransform2string(tstr);\n    } else {\n        tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || E);\n    }\n    el._.transform = tstr;\n    var m = transform2matrix(tstr, el.getBBox(1));\n    if (doReturn) {\n        return m;\n    } else {\n        el.matrix = m;\n    }\n\n    // _.sx = sx;\n    // _.sy = sy;\n    // _.deg = deg;\n    // _.dx = dx = m.e;\n    // _.dy = dy = m.f;\n    // \n    // if (sx == 1 && sy == 1 && !deg && _.bbox) {\n    //     _.bbox.x += +dx;\n    //     _.bbox.y += +dy;\n    // } else {\n    //     _.dirtyT = 1;\n    // }\n}\nSnap._unit2px = unit2px;\nfunction getSomeDefs(el) {\n    if (Snap._.someDefs) {\n        return Snap._.someDefs;\n    }\n    var p = el.paper ||\n            (el.node.parentNode && Snap(el.node.parentNode)) ||\n            Snap.select(\"svg\") ||\n            Snap(0, 0),\n        defs = p.select(\"defs\").node;\n    if (!defs) {\n        defs = make(\"defs\", p.node).node;\n    }\n    Snap._.someDefs = defs;\n    return defs;\n}\nSnap._.getSomeDefs = getSomeDefs;\nfunction unit2px(el, name, value) {\n    var defs = getSomeDefs(el),\n        out = {},\n        mgr = defs.querySelector(\".svg---mgr\");\n    if (!mgr) {\n        mgr = $(\"rect\");\n        $(mgr, {width: 10, height: 10, \"class\": \"svg---mgr\"});\n        defs.appendChild(mgr);\n    }\n    function getW(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {width: val});\n        return mgr.getBBox().width;\n    }\n    function getH(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {height: val});\n        return mgr.getBBox().height;\n    }\n    function set(nam, f) {\n        if (name == null) {\n            out[nam] = f(el.attr(nam));\n        } else if (nam == name) {\n            out = f(value == null ? el.attr(nam) : value);\n        }\n    }\n    switch (el.type) {\n        case \"rect\":\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        case \"image\":\n            set(\"width\", getW);\n            set(\"height\", getH);\n        case \"text\":\n            set(\"x\", getW);\n            set(\"y\", getH);\n        break;\n        case \"circle\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"r\", getW);\n        break;\n        case \"ellipse\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        break;\n        case \"line\":\n            set(\"x1\", getW);\n            set(\"x2\", getW);\n            set(\"y1\", getH);\n            set(\"y2\", getH);\n        break;\n        case \"marker\":\n            set(\"refX\", getW);\n            set(\"markerWidth\", getW);\n            set(\"refY\", getH);\n            set(\"markerHeight\", getH);\n        break;\n        case \"radialGradient\":\n            set(\"fx\", getW);\n            set(\"fy\", getH);\n        break;\n        case \"tspan\":\n            set(\"dx\", getW);\n            set(\"dy\", getH);\n        break;\n        default:\n            set(name, getW);\n    }\n    return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n    return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n    var nodelist = glob.doc.querySelectorAll(query),\n        set = (Snap.set || Array)();\n    for (var i = 0; i < nodelist.length; i++) {\n        set.push(wrap(nodelist[i]));\n    }\n    return set;\n};\n\nfunction add2group(list) {\n    if (!is(list, \"array\")) {\n        list = Array.prototype.slice.call(arguments, 0);\n    }\n    var i = 0,\n        j = 0,\n        node = this.node;\n    while (this[i]) delete this[i++];\n    for (i = 0; i < list.length; i++) {\n        if (list[i].type == \"set\") {\n            list[i].forEach(function (el) {\n                node.appendChild(el.node);\n            });\n        } else {\n            node.appendChild(list[i].node);\n        }\n    }\n    var children = node.childNodes;\n    for (i = 0; i < children.length; i++) if (children[i].snap) {\n        this[j++] = hub[children[i].snap];\n    }\n}\nfunction Element(el) {\n    if (el.snap in hub) {\n        return hub[el.snap];\n    }\n    var id = this.id = ID(),\n        svg;\n    try {\n        svg = el.ownerSVGElement;\n    } catch(e) {}\n    this.node = el;\n    if (svg) {\n        this.paper = new Paper(svg);\n    }\n    this.type = el.tagName;\n    this.anims = {};\n    this._ = {\n        transform: [],\n        sx: 1,\n        sy: 1,\n        deg: 0,\n        dx: 0,\n        dy: 0,\n        dirty: 1\n    };\n    el.snap = id;\n    hub[id] = this;\n    if (this.type == \"g\") {\n        this.add = add2group;\n        for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n            this[method] = Paper.prototype[method];\n        }\n    }\n}\nfunction arrayFirstValue(arr) {\n    var res;\n    for (var i = 0, ii = arr.length; i < ii; i++) {\n        res = res || arr[i];\n        if (res) {\n            return res;\n        }\n    }\n}\n(function (elproto) {\n    // SIERRA Element.attr(): There appear to be two possible return values, one of which is blank. (Search the doc for _Returns:_ to identify problems.)\n    /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Gets or sets given attributes of the element\n     **\n     - params (object) contains key-value pairs of attributes you want to set\n     * or\n     - param (string) name of the attribute\n     = (Element) the current element\n     * or\n     = (string) value of attribute\n     > Usage\n     | el.attr({\n     |     fill: \"#fc0\",\n     |     stroke: \"#000\",\n     |     strokeWidth: 2, // CamelCase...\n     |     \"fill-opacity\": 0.5 // or dash-separated names\n     | });\n     | console.log(el.attr(\"fill\")); // #fc0\n    \\*/\n    elproto.attr = function (params, value) {\n        var el = this,\n            node = el.node;\n        if (!params) {\n            return el;\n        }\n        if (is(params, \"string\")) {\n            if (arguments.length > 1) {\n                var json = {};\n                json[params] = value;\n                params = json;\n            } else {\n                return arrayFirstValue(eve(\"snap.util.getattr.\"+params, el));\n            }\n        }\n        for (var att in params) {\n            if (params[has](att)) {\n                eve(\"snap.util.attr.\" + att, el, params[att]);\n            }\n        }\n        return el;\n    };\n// SIERRA Element.getBBox(): Unclear why you would want to express the dimension of the box as a path.\n// SIERRA Element.getBBox(): Unclear why you would want to use r0/r1/r2. Also, basic definitions: wouldn't the _smallest circle that can be enclosed_ be a zero-radius point?\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Returns the bounding box descriptor for the given element\n     **\n     = (object) bounding box descriptor:\n     o {\n     o     cx: (number) x of the center,\n     o     cy: (number) x of the center,\n     o     h: (number) height,\n     o     height: (number) height,\n     o     path: (string) path command for the box,\n     o     r0: (number) radius of a circle that fully encloses the box,\n     o     r1: (number) radius of the smallest circle that can be enclosed,\n     o     r2: (number) radius of the largest circle that can be enclosed,\n     o     vb: (string) box as a viewbox command,\n     o     w: (number) width,\n     o     width: (number) width,\n     o     x2: (number) x of the right side,\n     o     x: (number) x of the left side,\n     o     y2: (number) y of the bottom edge,\n     o     y: (number) y of the top edge\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        var el = this;\n        if (el.type == \"use\") {\n            el = el.original;\n        }\n        if (el.removed) {\n            return {};\n        }\n        var _ = el._;\n        if (isWithoutTransform) {\n            if (_.dirty || !_.bboxwt) {\n                el.realPath = Snap.path.get[el.type](el);\n                _.bboxwt = Snap.path.getBBox(el.realPath);\n                _.bboxwt.toString = x_y_w_h;\n                _.dirty = 0;\n            }\n            return Snap._.box(_.bboxwt);\n        }\n        if (_.dirty || _.dirtyT || !_.bbox) {\n            if (_.dirty || !el.realPath) {\n                _.bboxwt = 0;\n                el.realPath = Snap.path.get[el.type](el);\n            }\n            _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, el.matrix));\n            _.bbox.toString = x_y_w_h;\n            _.dirty = _.dirtyT = 0;\n        }\n        return Snap._.box(_.bbox);\n    };\n    var propString = function () {\n        return this.local;\n    };\n// SIERRA Element.transform(): seems to allow two return values, one of which (_Element_) is undefined.\n// SIERRA Element.transform(): if this only accepts one argument, it's unclear how it can both _get_ and _set_ a transform.\n// SIERRA Element.transform(): Unclear how Snap transform string format differs from SVG's.\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Gets or sets transformation of the element\n     **\n     - tstr (string) transform string in Snap or SVG format\n     = (Element) the current element\n     * or\n     = (object) transformation descriptor:\n     o {\n     o     string (string) transform string,\n     o     globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n     o     localMatrix (Matrix) matrix of transformations applied only to the element,\n     o     diffMatrix (Matrix) matrix of difference between global and local transformations,\n     o     global (string) global transformation as string,\n     o     local (string) local transformation as string,\n     o     toString (function) returns `string` property\n     o }\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            var global = new Matrix(this.node.getCTM()),\n                local = extractTransform(this);\n            return {\n                string: Str(_.transform) || \"\",\n                globalMatrix: global,\n                localMatrix: local,\n                diffMatrix: global.clone().add(local.invert()),\n                global: global.toTransformString(),\n                local: local.toTransformString(),\n                toString: propString\n            };\n        }\n        if (tstr instanceof Matrix) {\n            // may be need to apply it directly\n            // TODO: investigate\n            tstr = tstr.toTransformString();\n        }\n        extractTransform(this, tstr);\n\n        if (this.node) {\n            if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n                $(this.node, {gradientTransform: this.matrix});\n            } else if (this.type == \"pattern\") {\n                $(this.node, {patternTransform: this.matrix});\n            } else {\n                $(this.node, {transform: this.matrix});\n            }\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.parent\n     [ method ]\n     **\n     * Returns the element's parent\n     **\n     = (Element) the parent element\n    \\*/\n    elproto.parent = function () {\n        return wrap(this.node.parentNode);\n    };\n    /*\\\n     * Element.append\n     [ method ]\n     **\n     * Appends the given element to current one\n     **\n     - el (Element|Set) element to append\n     = (Element) the parent element\n    \\*/\n    /*\\\n     * Element.add\n     [ method ]\n     **\n     * See @Element.append\n    \\*/\n    elproto.append = elproto.add = function (el) {\n        if (el.type == \"set\") {\n            var it = this;\n            el.forEach(function (el) {\n                it.append(el);\n            });\n            return this;\n        }\n        el = wrap(el);\n        this.node.appendChild(el.node);\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.prepend\n     [ method ]\n     **\n     * Prepends the given element to the current one\n     **\n     - el (Element) element to prepend\n     = (Element) the parent element\n    \\*/\n    elproto.prepend = function (el) {\n        el = wrap(el);\n        this.node.insertBefore(el.node, this.node.firstChild);\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.before\n     [ method ]\n     **\n     * Inserts given element before the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    // TODO make it work for sets too\n    elproto.before = function (el) {\n        el = wrap(el);\n        this.node.parentNode.insertBefore(el.node, this.node);\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.after\n     [ method ]\n     **\n     * Inserts given element after the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.after = function (el) {\n        el = wrap(el);\n        this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertBefore = function (el) {\n        el = wrap(el);\n        el.node.parentNode.insertBefore(this.node, el.node);\n        this.paper = el.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertAfter = function (el) {\n        el = wrap(el);\n        el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n        this.paper = el.paper;\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the DOM\n     = (Element) the detached element\n    \\*/\n    elproto.remove = function () {\n        this.node.parentNode && this.node.parentNode.removeChild(this.node);\n        delete this.paper;\n        this.removed = true;\n        return this;\n    };\n    /*\\\n     * Element.select\n     [ method ]\n     **\n     * Gathers the nested @Element matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Element) result of query selection\n    \\*/\n    elproto.select = function (query) {\n        return wrap(this.node.querySelector(query));\n    };\n    /*\\\n     * Element.selectAll\n     [ method ]\n     **\n     * Gathers nested @Element objects matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Set|array) result of query selection\n    \\*/\n    elproto.selectAll = function (query) {\n        var nodelist = this.node.querySelectorAll(query),\n            set = (Snap.set || Array)();\n        for (var i = 0; i < nodelist.length; i++) {\n            set.push(wrap(nodelist[i]));\n        }\n        return set;\n    };\n    /*\\\n     * Element.asPX\n     [ method ]\n     **\n     * Returns given attribute of the element as a `px` value (not %, em, etc.)\n     **\n     - attr (string) attribute name\n     - value (string) #optional attribute value\n     = (Element) result of query selection\n    \\*/\n    elproto.asPX = function (attr, value) {\n        if (value == null) {\n            value = this.attr(attr);\n        }\n        return unit2px(this, attr, value);\n    };\n    // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned <use> instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n    /*\\\n     * Element.use\n     [ method ]\n     **\n     * Creates a `<use>` element linked to the current element\n     **\n     = (Element) the `<use>` element\n    \\*/\n    elproto.use = function () {\n        var use,\n            id = this.node.id;\n        if (!id) {\n            id = this.id;\n            $(this.node, {\n                id: id\n            });\n        }\n        if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n            this.type == \"pattern\") {\n            use = make(this.type, this.node.parentNode);\n        } else {\n            use = make(\"use\", this.node.parentNode);\n        }\n        $(use.node, {\n            \"xlink:href\": \"#\" + id\n        });\n        use.original = this;\n        return use;\n    };\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     * Creates a clone of the element and inserts it after the element\n     **\n     = (Element) the clone\n    \\*/\n    function fixids(el) {\n        var els = el.selectAll(\"*\"),\n            it,\n            url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n            ids = [],\n            uses = {};\n        function urltest(it, name) {\n            var val = $(it.node, name);\n            val = val && val.match(url);\n            val = val && val[2];\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    var attr = {};\n                    attr[name] = \"url(#\" + id + \")\";\n                    $(it.node, attr);\n                });\n            }\n        }\n        function linktest(it) {\n            var val = $(it.node, \"xlink:href\");\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    it.attr(\"xlink:href\", \"#\" + id);\n                });\n            }\n        }\n        for (var i = 0, ii = els.length; i < ii; i++) {\n            it = els[i];\n            urltest(it, \"fill\");\n            urltest(it, \"stroke\");\n            urltest(it, \"filter\");\n            urltest(it, \"mask\");\n            urltest(it, \"clip-path\");\n            linktest(it);\n            var oldid = $(it.node, \"id\");\n            if (oldid) {\n                $(it.node, {id: it.id});\n                ids.push({\n                    old: oldid,\n                    id: it.id\n                });\n            }\n        }\n        for (i = 0, ii = ids.length; i < ii; i++) {\n            var fs = uses[ids[i].old];\n            if (fs) {\n                for (var j = 0, jj = fs.length; j < jj; j++) {\n                    fs[j](ids[i].id);\n                }\n            }\n        }\n    }\n    elproto.clone = function () {\n        var clone = wrap(this.node.cloneNode(true));\n        if ($(clone.node, \"id\")) {\n            $(clone.node, {id: clone.id});\n        }\n        fixids(clone);\n        clone.insertAfter(this);\n        return clone;\n    };\n// SIERRA Element.toDefs(): If this _moves_ an element to the <defs> region, why is the return value a _clone_? Also unclear why it's called the _relative_ <defs> section. Perhaps _shared_?\n    /*\\\n     * Element.toDefs\n     [ method ]\n     **\n     * Moves element to the shared `<defs>` area\n     **\n     = (Element) the clone\n    \\*/\n    elproto.toDefs = function () {\n        var defs = getSomeDefs(this);\n        defs.appendChild(this.node);\n        return this;\n    };\n// SIERRA Element.pattern(): x/y/width/height data types are listed as both String and Number. Is that an error, or does it mean strings are coerced?\n// SIERRA Element.pattern(): clarify that x/y are offsets that e.g., may add gutters between the tiles.\n    /*\\\n     * Element.pattern\n     [ method ]\n     **\n     * Creates a `<pattern>` element from the current element\n     **\n     * To create a pattern you have to specify the pattern rect:\n     - x (string|number)\n     - y (string|number)\n     - width (string|number)\n     - height (string|number)\n     = (Element) the `<pattern>` element\n     * You can use pattern later on as an argument for `fill` attribute:\n     | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n     |         fill: \"none\",\n     |         stroke: \"#bada55\",\n     |         strokeWidth: 5\n     |     }).pattern(0, 0, 10, 10),\n     |     c = paper.circle(200, 200, 100);\n     | c.attr({\n     |     fill: p\n     | });\n    \\*/\n    elproto.pattern = function (x, y, width, height) {\n        var p = make(\"pattern\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (x && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        $(p.node, {\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            patternUnits: \"userSpaceOnUse\",\n            id: p.id,\n            viewBox: [x, y, width, height].join(\" \")\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values.  Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where?  Couldn't they also be assigned default values?\n    /*\\\n     * Element.marker\n     [ method ]\n     **\n     * Creates a `<marker>` element from the current element\n     **\n     * To create a marker you have to specify the bounding rect and reference point:\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - refX (number)\n     - refY (number)\n     = (Element) the `<marker>` element\n     * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n    \\*/\n    // TODO add usage for markers\n    elproto.marker = function (x, y, width, height, refX, refY) {\n        var p = make(\"marker\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (x && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            refX = x.refX || x.cx;\n            refY = x.refY || x.cy;\n            x = x.x;\n        }\n        $(p.node, {\n            viewBox: [x, y, width, height].join(S),\n            markerWidth: width,\n            markerHeight: height,\n            orient: \"auto\",\n            refX: refX || 0,\n            refY: refY || 0,\n            id: p.id\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n    // animation\n    function slice(from, to, f) {\n        return function (arr) {\n            var res = arr.slice(from, to);\n            if (res.length == 1) {\n                res = res[0];\n            }\n            return f ? f(res) : res;\n        };\n    }\n    var Animation = function (attr, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        this.attr = attr;\n        this.dur = ms;\n        easing && (this.easing = easing);\n        callback && (this.callback = callback);\n    };\n    // SIERRA All object methods should feature sample code. This is just one instance.\n    /*\\\n     * Snap.animation\n     [ method ]\n     **\n     * Creates an animation object\n     **\n     - attr (object) attributes of final destination\n     - duration (number) duration of the animation, in milliseconds\n     - easing (function) #optional one of easing functions of @mina or custom one\n     - callback (function) #optional callback function that fires when animation ends\n     = (object) animation object\n    \\*/\n    Snap.animation = function (attr, ms, easing, callback) {\n        return new Animation(attr, ms, easing, callback);\n    };\n    /*\\\n     * Element.inAnim\n     [ method ]\n     **\n     * Returns a set of animations that may be able to manipulate the current element\n     **\n     = (object) in format:\n     o {\n     o     anim (object) animation object,\n     o     curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    elproto.inAnim = function () {\n        var el = this,\n            res = [];\n        for (var id in el.anims) if (el.anims[has](id)) {\n            (function (a) {\n                res.push({\n                    anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n                    curStatus: a.status(),\n                    status: function (val) {\n                        return a.status(val);\n                    },\n                    stop: function () {\n                        a.stop();\n                    }\n                });\n            }(el.anims[id]));\n        }\n        return res;\n    };\n    // SIERRA unfamiliar with the phrase _caring function,_ so the text for the _setter_ param isn't clear.\n    // SIERRA With the animation's start/end states defined, how is its _speed_ distinguished from its _duration_?\n    // SIERRA Text explaining the mina format should move to the section on the mina object interface. (Prior comment applies: object interfaces need to also be documented.)\n    // SIERRA unclear how to express a custom _easing_ (+)\n    /*\\\n     * Snap.animate\n     [ method ]\n     **\n     * Runs generic animation of one number into another with a caring function\n     **\n     - from (number|array) number or array of numbers\n     - to (number|array) number or array of numbers\n     - setter (function) caring function that accepts one number argument\n     - duration (number) duration, in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function to execute when animation ends\n     = (object) animation object in @mina format\n     o {\n     o     id (string) animation id, consider it read-only,\n     o     duration (function) gets or sets the duration of the animation,\n     o     easing (function) easing,\n     o     speed (function) gets or sets the speed of the animation,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    Snap.animate = function (from, to, setter, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        var now = mina.time(),\n            anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n        callback && eve.once(\"mina.finish.\" + anim.id, callback);\n        return anim;\n    };\n    // SIERRA Element.stop(). Does it _stop_ or _pause_ the animations? If you run Element.animate() to restart the animation, does it commence from the beginning?\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops all the animations for the current element\n     **\n     = (Element) the current element\n    \\*/\n    elproto.stop = function () {\n        var anims = this.inAnim();\n        for (var i = 0, ii = anims.length; i < ii; i++) {\n            anims[i].stop();\n        }\n        return this;\n    };\n    // SIERRA Element.animate(): For _attrs_, clarify if they represent the destination values, and if the animation executes relative to the element's current attribute values.\n    // SIERRA would a _custom_ animation function be an SVG keySplines value?\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Animates the given attributes of the element\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     = (Element) the current element\n    \\*/\n    elproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = easing.dur;\n            attrs = attrs.attr;\n        }\n        var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n            el = this;\n        for (var key in attrs) if (attrs[has](key)) {\n            if (el.equal) {\n                eq = el.equal(key, Str(attrs[key]));\n                from = eq.from;\n                to = eq.to;\n                f = eq.f;\n            } else {\n                from = +el.attr(key);\n                to = +attrs[key];\n            }\n            var len = is(from, \"array\") ? from.length : 1;\n            keys[key] = slice(fkeys.length, fkeys.length + len, f);\n            fkeys = fkeys.concat(from);\n            tkeys = tkeys.concat(to);\n        }\n        var now = mina.time(),\n            anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n                var attr = {};\n                for (var key in keys) if (keys[has](key)) {\n                    attr[key] = keys[key](val);\n                }\n                el.attr(attr);\n            }, easing);\n        el.anims[anim.id] = anim;\n        anim._attrs = attrs;\n        anim._callback = callback;\n        eve.once(\"mina.finish.\" + anim.id, function () {\n            delete el.anims[anim.id];\n            callback && callback.call(el);\n        });\n        eve.once(\"mina.stop.\" + anim.id, function () {\n            delete el.anims[anim.id];\n        });\n        return el;\n    };\n    var eldata = {};\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key. (Don’t confuse\n     * with `data-` attributes)\n     *\n     * See also @Element.removeData\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 1) {\n            if (Snap.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"snap.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"snap.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            eldata[this.id] = {};\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n    // SIERRA Element.toString(): Recommend renaming this _outerSVG_ to keep it consistent with HTML & innerSVG, and also to avoid confusing it with what textContent() does. Cross-reference with innerSVG.\n    /*\\\n     * Element.toString\n     [ method ]\n     **\n     * Returns SVG code for the element, equivalent to HTML's `outerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.toString = toString(1);\n    /*\\\n     * Element.innerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.innerSVG = toString();\n    function toString(type) {\n        return function () {\n            var res = type ? \"<\" + this.type : \"\",\n                attr = this.node.attributes,\n                chld = this.node.childNodes;\n            if (type) {\n                for (var i = 0, ii = attr.length; i < ii; i++) {\n                    res += \" \" + attr[i].name + '=\"' +\n                            attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n                }\n            }\n            if (chld.length) {\n                type && (res += \">\");\n                for (i = 0, ii = chld.length; i < ii; i++) {\n                    if (chld[i].nodeType == 3) {\n                        res += chld[i].nodeValue;\n                    } else if (chld[i].nodeType == 1) {\n                        res += wrap(chld[i]).toString();\n                    }\n                }\n                type && (res += \"</\" + this.type + \">\");\n            } else {\n                type && (res += \"/>\");\n            }\n            return res;\n        };\n    }\n}(Element.prototype));\n// SIERRA Snap.parse() accepts & returns a fragment, but there's no info on what it does in between. What if it doesn't parse?\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n    var f = glob.doc.createDocumentFragment(),\n        pointer = f;\n    eve.on(\"elemental.tag\", function (data, extra, raw) {\n        var tag = $(data);\n        extra && $(tag, extra);\n        pointer.appendChild(tag);\n        pointer = tag;\n    });\n    eve.on(\"elemental.text\", function (text) {\n        pointer.appendChild(glob.doc.createTextNode(text));\n    });\n    eve.on(\"elemental./tag\", function () {\n        pointer = pointer.parentNode;\n    });\n    eve.on(\"elemental.eof\", function () {\n        eve.off(\"elemental.*\");\n        eve(\"snap.parsed\", f);\n    });\n    elemental().parse(svg).end();\n    return new Fragment(f);\n};\nfunction Fragment(frag) {\n    this.node = frag;\n}\n/*\\\n * Fragment.select\n [ method ]\n **\n * See @Element.select\n\\*/\nFragment.prototype.select = Element.prototype.select;\n/*\\\n * Fragment.selectAll\n [ method ]\n **\n * See @Element.selectAll\n\\*/\nFragment.prototype.selectAll = Element.prototype.selectAll;\n// SIERRA Snap.fragment() could especially use a code example\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n    var args = Array.prototype.slice.call(arguments, 0),\n        f = glob.doc.createDocumentFragment();\n    for (var i = 0, ii = args.length; i < ii; i++) {\n        var item = args[i];\n        if (item.node && item.node.nodeType) {\n            f.appendChild(item.node);\n        }\n        if (item.nodeType) {\n            f.appendChild(item);\n        }\n        if (typeof item == \"string\") {\n            f.appendChild(Snap.parse(item).node);\n        }\n    }\n    return new Fragment(f);\n};\n\nfunction make(name, parent) {\n    var res = $(name);\n    parent.appendChild(res);\n    var el = wrap(res);\n    el.type = name;\n    return el;\n}\n// SIERRA Is Paper() part of final interface, akin to Snap()? Document if so.\nfunction Paper(w, h) {\n    var res,\n        desc,\n        defs,\n        proto = Paper.prototype;\n    if (w && w.tagName == \"svg\") {\n        if (w.snap in hub) {\n            return hub[w.snap];\n        }\n        res = new Element(w);\n        desc = w.getElementsByTagName(\"desc\")[0];\n        defs = w.getElementsByTagName(\"defs\")[0];\n        if (!desc) {\n            desc = $(\"desc\");\n            desc.appendChild(glob.doc.createTextNode(\"Created with Snap\"));\n            res.node.appendChild(desc);\n        }\n        if (!defs) {\n            defs = $(\"defs\");\n            res.node.appendChild(defs);\n        }\n        res.defs = defs;\n        for (var key in proto) if (proto[has](key)) {\n            res[key] = proto[key];\n        }\n        res.paper = res.root = res;\n    } else {\n        res = make(\"svg\", glob.doc.body);\n        $(res.node, {\n            height: h,\n            version: 1.1,\n            width: w,\n            xmlns: \"http://www.w3.org/2000/svg\"\n        });\n    }\n    return res;\n}\nfunction wrap(dom) {\n    if (!dom) {\n        return dom;\n    }\n    if (dom instanceof Element || dom instanceof Fragment) {\n        return dom;\n    }\n    if (dom.tagName == \"svg\") {\n        return new Paper(dom);\n    }\n    return new Element(dom);\n}\n// gradients' helpers\nfunction Gstops() {\n    return this.selectAll(\"stop\");\n}\nfunction GaddStop(color, offset) {\n    var stop = $(\"stop\"),\n        attr = {\n            offset: +offset + \"%\"\n        };\n    color = Snap.color(color);\n    attr[\"stop-color\"] = color.hex;\n    if (color.opacity < 1) {\n        attr[\"stop-opacity\"] = color.opacity;\n    }\n    $(stop, attr);\n    this.node.appendChild(stop);\n    return this;\n}\nfunction GgetBBox() {\n    if (this.type == \"linearGradient\") {\n        var x1 = $(this.node, \"x1\") || 0,\n            x2 = $(this.node, \"x2\") || 1,\n            y1 = $(this.node, \"y1\") || 0,\n            y2 = $(this.node, \"y2\") || 0;\n        return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n    } else {\n        var cx = this.node.cx || .5,\n            cy = this.node.cy || .5,\n            r = this.node.r || 0;\n        return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n    }\n}\nfunction gradient(defs, str) {\n    var grad = arrayFirstValue(eve(\"snap.util.grad.parse\", null, str)),\n        el;\n    if (!grad) {\n        return null;\n    }\n    grad.params.unshift(defs);\n    if (grad.type.toLowerCase() == \"l\") {\n        el = gradientLinear.apply(0, grad.params);\n    } else {\n        el = gradientRadial.apply(0, grad.params);\n    }\n    if (grad.type != grad.type.toLowerCase()) {\n        $(el.node, {\n            gradientUnits: \"userSpaceOnUse\"\n        });\n    }\n    var stops = grad.stops,\n        len = stops.length,\n        start = 0,\n        j = 0;\n    function seed(i, end) {\n        var step = (end - start) / (i - j);\n        for (var k = j; k < i; k++) {\n            stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n        }\n        j = i;\n        start = end;\n    }\n    len--;\n    for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n        seed(i, stops[i].offset);\n    }\n    stops[len].offset = stops[len].offset || 100;\n    seed(len, stops[len].offset);\n    for (i = 0; i <= len; i++) {\n        var stop = stops[i];\n        el.addStop(stop.color, stop.offset);\n    }\n    return el;\n}\nfunction gradientLinear(defs, x1, y1, x2, y2) {\n    var el = make(\"linearGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (x1 != null) {\n        $(el.node, {\n            x1: x1,\n            y1: y1,\n            x2: x2,\n            y2: y2\n        });\n    }\n    return el;\n}\nfunction gradientRadial(defs, cx, cy, r, fx, fy) {\n    var el = make(\"radialGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (cx != null) {\n        $(el.node, {\n            cx: cx,\n            cy: cy,\n            r: r\n        });\n    }\n    if (fx != null && fy != null) {\n        $(el.node, {\n            fx: fx,\n            fy: fy\n        });\n    }\n    return el;\n}\n// Paper prototype methods\n(function (proto) {\n    /*\\\n     * Paper.el\n     [ method ]\n     **\n     * Creates an element on paper with a given name and no attributes\n     **\n     - name (string) tag name\n     - attr (object) attributes\n     = (Element) the current element\n     > Usage\n     | var c = paper.circle(10, 10, 10); // is the same as...\n     | var c = paper.el(\"circle\").attr({\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n    \\*/\n    proto.el = function (name, attr) {\n        return make(name, this.node).attr(attr);\n    };\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - rx (number) #optional horizontal radius for rounded corners, default is 0\n     - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n     = (object) the `rect` element\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    proto.rect = function (x, y, w, h, rx, ry) {\n        var el = make(\"rect\", this.node);\n        if (ry == null) {\n            ry = rx;\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            el.attr(x);\n        } else if (x != null) {\n            el.attr({\n                x: x,\n                y: y,\n                width: w,\n                height: h\n            });\n            if (rx != null) {\n                el.attr({\n                    rx: rx,\n                    ry: ry\n                });\n            }\n        }\n        return el;\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) the `circle` element\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    proto.circle = function (cx, cy, r) {\n        var el = make(\"circle\", this.node);\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            el.attr(cx);\n        } else if (cx != null) {\n            el.attr({\n                cx: cx,\n                cy: cy,\n                r: r\n            });\n        }\n        return el;\n    };\n\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Places an image on the surface\n     **\n     - src (string) URI of the source image\n     - x (number) x offset position\n     - y (number) y offset position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) the `image` element\n     * or\n     = (object) Raphaël element object with type `image`\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    proto.image = function (src, x, y, width, height) {\n        var el = make(\"image\", this.node);\n        if (is(src, \"object\") && \"src\" in src) {\n            el.attr(src);\n        } else if (src != null) {\n            var set = {\n                \"xlink:href\": src,\n                preserveAspectRatio: \"none\"\n            };\n            if (x != null && y != null) {\n                set.x = x;\n                set.y = y;\n            }\n            if (width != null && height != null) {\n                set.width = width;\n                set.height = height;\n            } else {\n                preload(src, function () {\n                    $(el.node, {\n                        width: this.offsetWidth,\n                        height: this.offsetHeight\n                    });\n                });\n            }\n            $(el.node, set);\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) the `ellipse` element\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    proto.ellipse = function (cx, cy, rx, ry) {\n        var el = make(\"ellipse\", this.node);\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            el.attr(cx);\n        } else if (cx != null) {\n            el.attr({\n                cx: cx,\n                cy: cy,\n                rx: rx,\n                ry: ry\n            });\n        }\n        return el;\n    };\n    // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a `<path>` element using the given string as the path's definition\n     - pathString (string) #optional path string in SVG format\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n     | \"M10,20L30,40\"\n     * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n     * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n    \\*/\n    proto.path = function (d) {\n        var el = make(\"path\", this.node);\n        if (is(d, \"object\") && !is(d, \"array\")) {\n            el.attr(d);\n        } else if (d) {\n            el.attr({\n                d: d\n            });\n        }\n        return el;\n    };\n// SIERRA Paper.g(): Don't understand the code comment about the order being _different._ Wouldn't it be a rect followed by a circle?\n    /*\\\n     * Paper.g\n     [ method ]\n     **\n     * Creates a group element\n     **\n     - varargs (…) #optional elements to nest within the group\n     = (object) the `g` element\n     **\n     > Usage\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g(c2, c1); // note that the order of elements is different\n     * or\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g();\n     | g.add(c2, c1);\n    \\*/\n    /*\\\n     * Paper.group\n     [ method ]\n     **\n     * See @Paper.g\n    \\*/\n    proto.group = proto.g = function (first) {\n        var el = make(\"g\", this.node);\n        el.add = add2group;\n        for (var method in proto) if (proto[has](method)) {\n            el[method] = proto[method];\n        }\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string|array) The text string to draw or array of strings to nest within separate `<tspan>` elements\n     = (object) the `text` element\n     **\n     > Usage\n     | var t1 = paper.text(50, 50, \"Snap\");\n     | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n    \\*/\n    proto.text = function (x, y, text) {\n        var el = make(\"text\", this.node);\n        if (is(x, \"object\")) {\n            el.attr(x);\n        } else if (x != null) {\n            el.attr({\n                x: x,\n                y: y,\n                text: text || \"\"\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.line\n     [ method ]\n     **\n     * Draws a line\n     **\n     - x1 (number) x coordinate position of the start\n     - y1 (number) y coordinate position of the start\n     - x2 (number) x coordinate position of the end\n     - y2 (number) y coordinate position of the end\n     = (object) the `line` element\n     **\n     > Usage\n     | var t1 = paper.line(50, 50, 100, 100);\n    \\*/\n    proto.line = function (x1, y1, x2, y2) {\n        var el = make(\"line\", this.node);\n        if (is(x1, \"object\")) {\n            el.attr(x1);\n        } else if (x1 != null) {\n            el.attr({\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polyline\n     [ method ]\n     **\n     * Draws a polyline\n     **\n     - points (array) array of points\n     * or\n     - varargs (…) points\n     = (object) the `polyline` element\n     **\n     > Usage\n     | var p1 = paper.polyline([10, 10, 100, 100]);\n     | var p2 = paper.polyline(10, 10, 100, 100);\n    \\*/\n    proto.polyline = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polyline\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polygon\n     [ method ]\n     **\n     * Draws a polygon. See @Paper.polyline\n    \\*/\n    proto.polygon = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polygon\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    // gradients\n    (function () {\n        /*\\\n         * Paper.gradient\n         [ method ]\n         **\n         * Creates a gradient element\n         **\n         - gradient (string) gradient descriptor\n         > Gradient Descriptor\n         * The gradient descriptor is an expression formatted as\n         * follows: `<type>(<coords>)<colors>`.  The `<type>` can be\n         * either linear or radial.  The uppercase `L` or `R` letters\n         * indicate absolute coordinates offset from the SVG surface.\n         * Lowercase `l` or `r` letters indicate coordinates\n         * calculated relative to the element to which the gradient is\n         * applied.  Coordinates specify a linear gradient vector as\n         * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n         * `r` and optional `fx`, `fy` specifying a focal point away\n         * from the center of the circle. Specify `<colors>` as a list\n         * of dash-separated CSS color values.  Each color may be\n         * followed by a custom offset value, separated with a colon\n         * character.\n         > Examples\n         * Linear gradient, relative from top-left corner to bottom-right\n         * corner, from black through red to white:\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         * Linear gradient, absolute from (0, 0) to (100, 100), from black\n         * through red at 25% to white:\n         | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25%-#fff\");\n         * Radial gradient, relative from the center of the element with radius\n         * half the width, from black to white:\n         | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n         * To apply the gradient:\n         | paper.circle(50, 50, 40).attr({\n         |     fill: g\n         | });\n         = (object) the `gradient` element\n        \\*/\n        proto.gradient = function (str) {\n            return gradient(this.defs, str);\n        };\n        proto.gradientLinear = function (x1, y1, x2, y2) {\n            return gradientLinear(this.defs, x1, y1, x2, y2);\n        };\n        proto.gradientRadial = function (cx, cy, r, fx, fy) {\n            return gradientRadial(this.defs, cx, cy, r, fx, fy);\n        };\n        /*\\\n         * Paper.toString\n         [ method ]\n         **\n         * Returns SVG code for the @Paper\n         = (string) SVG code for the @Paper\n        \\*/\n        proto.toString = function () {\n            var f = glob.doc.createDocumentFragment(),\n                d = glob.doc.createElement(\"div\"),\n                svg = this.node.cloneNode(true),\n                res;\n            f.appendChild(d);\n            d.appendChild(svg);\n            $(svg, {xmlns: \"http://www.w3.org/2000/svg\"});\n            res = d.innerHTML;\n            f.removeChild(f.firstChild);\n            return res;\n        };\n    }());\n}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n    var req = new XMLHttpRequest,\n        id = ID();\n    if (req) {\n        if (is(postData, \"function\")) {\n            scope = callback;\n            callback = postData;\n            postData = null;\n        } else if (is(postData, \"object\")) {\n            var pd = [];\n            for (var key in postData) if (postData.hasOwnProperty(key)) {\n                pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n            }\n            postData = pd.join(\"&\");\n        }\n        req.open((postData ? \"POST\" : \"GET\"), url, true);\n        req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n        if (postData) {\n            req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n        }\n        if (callback) {\n            eve.once(\"snap.ajax.\" + id + \".0\", callback);\n            eve.once(\"snap.ajax.\" + id + \".200\", callback);\n            eve.once(\"snap.ajax.\" + id + \".304\", callback);\n        }\n        req.onreadystatechange = function() {\n            if (req.readyState != 4) return;\n            eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n        };\n        if (req.readyState == 4) {\n            return req;\n        }\n        req.send(postData);\n        return req;\n    }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n    Snap.ajax(url, function (req) {\n        var f = Snap.parse(req.responseText);\n        scope ? callback.call(scope, f) : callback(f);\n    });\n};\n\n// Attributes event handlers\neve.on(\"snap.util.attr.mask\", function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value.type == \"mask\") {\n            var mask = value;\n        } else {\n            mask = make(\"mask\", getSomeDefs(this));\n            mask.node.appendChild(value.node);\n            !mask.node.id && $(mask.node, {\n                id: mask.id\n            });\n        }\n        $(this.node, {\n            mask: \"url(#\" + mask.id + \")\"\n        });\n    }\n});\n(function (clipIt) {\n    eve.on(\"snap.util.attr.clip\", clipIt);\n    eve.on(\"snap.util.attr.clip-path\", clipIt);\n    eve.on(\"snap.util.attr.clipPath\", clipIt);\n}(function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value.type == \"clipPath\") {\n            var clip = value;\n        } else {\n            clip = make(\"clipPath\", getSomeDefs(this));\n            clip.node.appendChild(value.node);\n            !clip.node.id && $(clip.node, {\n                id: clip.id\n            });\n        }\n        $(this.node, {\n            \"clip-path\": \"url(#\" + clip.id + \")\"\n        });\n    }\n}));\nfunction fillStroke(name) {\n    return function (value) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n            (value.node.firstChild.tagName == \"radialGradient\" ||\n            value.node.firstChild.tagName == \"linearGradient\" ||\n            value.node.firstChild.tagName == \"pattern\")) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value instanceof Element) {\n            if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n               || value.type == \"pattern\") {\n                if (!value.node.id) {\n                    $(value.node, {\n                        id: value.id\n                    });\n                }\n                var fill = \"url(#\" + value.node.id + \")\";\n            } else {\n                fill = value.attr(name);\n            }\n        } else {\n            fill = Snap.color(value);\n            if (fill.error) {\n                var grad = gradient(getSomeDefs(this), value);\n                if (grad) {\n                    if (!grad.node.id) {\n                        $(grad.node, {\n                            id: grad.id\n                        });\n                    }\n                    fill = \"url(#\" + grad.node.id + \")\";\n                } else {\n                    fill = value;\n                }\n            } else {\n                fill = Str(fill);\n            }\n        }\n        var attrs = {};\n        attrs[name] = fill;\n        $(this.node, attrs);\n        this.node.style[name] = E;\n    };\n}\neve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\neve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\nvar gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\neve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n    string = Str(string);\n    var tokens = string.match(gradrg);\n    if (!tokens) {\n        return null;\n    }\n    var type = tokens[1],\n        params = tokens[2],\n        stops = tokens[3];\n    params = params.split(/\\s*,\\s*/).map(function (el) {\n        return +el == el ? +el : el;\n    });\n    if (params.length == 1 && params[0] == 0) {\n        params = [];\n    }\n    stops = stops.split(\"-\");\n    stops = stops.map(function (el) {\n        el = el.split(\":\");\n        var out = {\n            color: el[0]\n        };\n        if (el[1]) {\n            out.offset = el[1];\n        }\n        return out;\n    });\n    return {\n        type: type,\n        params: params,\n        stops: stops\n    };\n});\n\neve.on(\"snap.util.attr.d\", function (value) {\n    eve.stop();\n    if (is(value, \"array\") && is(value[0], \"array\")) {\n        value = Snap.path.toString.call(value);\n    }\n    value = Str(value);\n    if (value.match(/[ruo]/i)) {\n        value = Snap.path.toAbsolute(value);\n    }\n    $(this.node, {d: value});\n})(-1);\neve.on(\"snap.util.attr.#text\", function (value) {\n    eve.stop();\n    value = Str(value);\n    var txt = glob.doc.createTextNode(value);\n    while (this.node.firstChild) {\n        this.node.removeChild(this.node.firstChild);\n    }\n    this.node.appendChild(txt);\n})(-1);\neve.on(\"snap.util.attr.path\", function (value) {\n    eve.stop();\n    this.attr({d: value});\n})(-1);\neve.on(\"snap.util.attr.viewBox\", function (value) {\n    var vb;\n    if (is(value, \"object\") && \"x\" in value) {\n        vb = [value.x, value.y, value.width, value.height].join(\" \");\n    } else if (is(value, \"array\")) {\n        vb = value.join(\" \");\n    } else {\n        vb = value;\n    }\n    $(this.node, {\n        viewBox: vb\n    });\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.transform\", function (value) {\n    this.transform(value);\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.r\", function (value) {\n    if (this.type == \"rect\") {\n        eve.stop();\n        $(this.node, {\n            rx: value,\n            ry: value\n        });\n    }\n})(-1);\neve.on(\"snap.util.attr.text\", function (value) {\n    if (this.type == \"text\") {\n        var i = 0,\n            node = this.node,\n            tuner = function (chunk) {\n                var out = $(\"tspan\");\n                if (is(chunk, \"array\")) {\n                    for (var i = 0; i < chunk.length; i++) {\n                        out.appendChild(tuner(chunk[i]));\n                    }\n                } else {\n                    out.appendChild(glob.doc.createTextNode(chunk));\n                }\n                out.normalize && out.normalize();\n                return out;\n            };\n        while (node.firstChild) {\n            node.removeChild(node.firstChild);\n        }\n        var tuned = tuner(value);\n        while (tuned.firstChild) {\n            node.appendChild(tuned.firstChild);\n        }\n    }\n    eve.stop();\n})(-1);\n// default\nvar availableAttributes = {\n    rect: {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        rx: 0,\n        ry: 0,\n        \"class\": 0\n    },\n    circle: {\n        cx: 0,\n        cy: 0,\n        r: 0,\n        \"class\": 0\n    },\n    ellipse: {\n        cx: 0,\n        cy: 0,\n        rx: 0,\n        ry: 0,\n        \"class\": 0\n    },\n    line: {\n        x1: 0,\n        y1: 0,\n        x2: 0,\n        y2: 0,\n        \"class\": 0\n    },\n    polyline: {\n        points: \"\",\n        \"class\": 0\n    },\n    polygon: {\n        points: \"\",\n        \"class\": 0\n    },\n    text: {\n        x: 0,\n        y: 0,\n        dx: 0,\n        dy: 0,\n        rotate: 0,\n        textLength: 0,\n        lengthAdjust: 0,\n        \"class\": 0\n    },\n    tspan: {\n        x: 0,\n        y: 0,\n        dx: 0,\n        dy: 0,\n        rotate: 0,\n        textLength: 0,\n        lengthAdjust: 0,\n        \"class\": 0\n    },\n    textPath: {\n        \"xlink:href\": 0,\n        startOffset: 0,\n        method: 0,\n        spacing: 0,\n        \"class\": 0\n    },\n    marker: {\n        viewBox: 0,\n        preserveAspectRatio: 0,\n        refX: 0,\n        refY: 0,\n        markerUnits: 0,\n        markerWidth: 0,\n        markerHeight: 0,\n        orient: 0,\n        \"class\": 0\n    },\n    use: {\n        \"class\": 0,\n        externalResourcesRequired: 0,\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        \"xlink:href\": 0\n    },\n    linearGradient: {\n        x1: 0,\n        y1: 0,\n        x2: 0,\n        y2: 0,\n        gradientUnits: 0,\n        gradientTransform: 0,\n        spreadMethod: 0,\n        \"xlink:href\": 0,\n        \"class\": 0\n    },\n    radialGradient: {\n        cx: 0,\n        cy: 0,\n        r: 0,\n        fx: 0,\n        fy: 0,\n        gradientUnits: 0,\n        gradientTransform: 0,\n        spreadMethod: 0,\n        \"xlink:href\": 0,\n        \"class\": 0\n    },\n    stop: {\n        offset: 0,\n        \"class\": 0\n    },\n    pattern: {\n        viewBox: 0,\n        preserveAspectRatio: 0,\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        patternUnits: 0,\n        patternContentUnits: 0,\n        patternTransform: 0,\n        \"xlink:href\": 0,\n        \"class\": 0\n    },\n    clipPath: {\n        transform: 0,\n        clipPathUnits: 0,\n        \"class\": 0\n    },\n    mask: {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        maskUnits: 0,\n        maskContentUnits: 0,\n        \"class\": 0\n    },\n    image: {\n        preserveAspectRatio: 0,\n        transform: 0,\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        \"xlink:href\": 0,\n        \"class\": 0\n    },\n    path: {\n        d: \"\",\n        \"class\": 0\n    },\n    g: {\n        \"class\": 0\n    },\n    feDistantLight: {\n        azimuth: 0,\n        elevation: 0\n    },\n    fePointLight: {\n        x: 0,\n        y: 0,\n        z: 0\n    },\n    feSpotLight: {\n        x: 0,\n        y: 0,\n        z: 0,\n        pointsAtX: 0,\n        pointsAtY: 0,\n        pointsAtZ: 0,\n        specularExponent: 0,\n        limitingConeAngle: 0\n    },\n    feBlend: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        in2: 0,\n        mode: 0\n    },\n    feColorMatrix: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        type: 0,\n        values: 0\n    },\n    feComponentTransfer: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0\n    },\n    feComposite: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        in2: 0,\n        operator: 0,\n        k1: 0,\n        k2: 0,\n        k3: 0,\n        k4: 0\n    },\n    feConvolveMatrix: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        order: 0,\n        kernelMatrix: 0,\n        divisor: 0,\n        bias: 0,\n        targetX: 0,\n        targetY: 0,\n        edgeMode: 0,\n        kernelUnitLength: 0,\n        preserveAlpha: 0\n    },\n    feDiffuseLighting: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        surfaceScale: 0,\n        diffuseConstant: 0,\n        kernelUnitLength: 0\n    },\n    feDisplacementMap: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        in2: 0,\n        scale: 0,\n        xChannelSelector: 0,\n        yChannelSelector: 0\n    },\n    feFlood: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"flood-color\": 0,\n        \"flood-opacity\": 0\n    },\n    feGaussianBlur: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        stdDeviation: 0\n    },\n    feImage : {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        externalResourcesRequired: 0,\n        preserveAspectRatio: 0,\n        \"xlink:href\": 0\n    },\n    feMerge: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0\n    },\n    feMergeNode: {\n        \"in\": 0\n    },\n    feMorphology: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        operator: 0,\n        radius: 0\n    },\n    feOffset: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        dx: 0,\n        dy: 0\n    },\n    feSpecularLighting: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0,\n        surfaceScale: 0,\n        specularConstant: 0,\n        specularExponent: 0,\n        kernelUnitLength: 0\n    },\n    feTile: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        \"in\": 0\n    },\n    feTurbulence: {\n        height: 0,\n        result: 0,\n        width: 0,\n        x: 0,\n        y: 0,\n        \"class\": 0,\n        style: 0,\n        baseFrequency: 0,\n        numOctaves: 0,\n        seed: 0,\n        stitchTiles: 0,\n        type: 0\n    }\n};\navailableAttributes.feFuncR = availableAttributes.feFuncG = availableAttributes.feFuncB = availableAttributes.feFuncA = {\n    type: 0,\n    tableValues: 0,\n    slope: 0,\n    intercept: 0,\n    amplitude: 0,\n    exponent: 0,\n    offset: 0\n};\neve.on(\"snap.util.attr\", function (value) {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    var style = att.replace(/-(\\w)/gi, function (all, letter) {\n        return letter.toUpperCase();\n    });\n    if (availableAttributes[has](this.type) && availableAttributes[this.type][has](att)) {\n        value == null ? this.node.removeAttribute(att) : this.node.setAttribute(att, value);\n    } else {\n        this.node.style[style] = value == null ? E : value;\n    }\n});\neve.on(\"snap.util.getattr.transform\", function () {\n    eve.stop();\n    return this.transform();\n})(-1);\n// Markers\n(function () {\n    function getter(end) {\n        return function () {\n            eve.stop();\n            var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n            if (style == \"none\") {\n                return style;\n            } else {\n                return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n            }\n        };\n    }\n    function setter(end) {\n        return function (value) {\n            eve.stop();\n            var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n            if (value == \"\" || !value) {\n                this.node.style[name] = \"none\";\n                return;\n            }\n            if (value.type == \"marker\") {\n                var id = value.node.id;\n                if (!id) {\n                    $(value.node, {id: value.id});\n                }\n                this.node.style[name] = \"url(#\" + id + \")\";\n                return;\n            }\n        };\n    }\n    eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n}());\neve.on(\"snap.util.getattr.r\", function () {\n    if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n        eve.stop();\n        return $(this.node, \"rx\");\n    }\n})(-1);\nfunction textExtract(node) {\n    var out = [];\n    var children = node.childNodes;\n    for (var i = 0, ii = children.length; i < ii; i++) {\n        var chi = children[i];\n        if (chi.nodeType == 3) {\n            out.push(chi.nodeValue);\n        }\n        if (chi.tagName == \"tspan\") {\n            if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n                out.push(chi.firstChild.nodeValue);\n            } else {\n                out.push(textExtract(chi));\n            }\n        }\n    }\n    return out;\n}\neve.on(\"snap.util.getattr.text\", function () {\n    if (this.type == \"text\" || this.type == \"tspan\") {\n        eve.stop();\n        var out = textExtract(this.node);\n        return out.length == 1 ? out[0] : out;\n    }\n})(-1);\neve.on(\"snap.util.getattr.#text\", function () {\n    return this.node.textContent;\n})(-1);\neve.on(\"snap.util.getattr.viewBox\", function () {\n    eve.stop();\n    var vb = $(this.node, \"viewBox\").split(separator);\n    return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n    // TODO: investigate why I need to z-index it\n})(-1);\neve.on(\"snap.util.getattr.points\", function () {\n    var p = $(this.node, \"points\");\n    eve.stop();\n    return p.split(separator);\n});\neve.on(\"snap.util.getattr.path\", function () {\n    var p = $(this.node, \"d\");\n    eve.stop();\n    return p;\n});\n// default\neve.on(\"snap.util.getattr\", function () {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    if (availableAttributes[has](this.type) && availableAttributes[this.type][has](att)) {\n        return this.node.getAttribute(att);\n    } else {\n        return glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(att);\n    }\n});\nSnap.plugin = function (f) {\n    f(Snap, Element, Paper, glob);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}());\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        clone = Snap._.clone,\n        has = \"hasOwnProperty\",\n        p2s = /,?([a-z]),?/gi,\n        toFloat = parseFloat,\n        math = Math,\n        PI = math.PI,\n        mmin = math.min,\n        mmax = math.max,\n        pow = math.pow,\n        abs = math.abs;\n    function paths(ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    }\n    function box(x, y, width, height) {\n        if (x == null) {\n            x = y = width = height = 0;\n        }\n        if (y == null) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        return {\n            x: x,\n            y: y,\n            width: width,\n            w: width,\n            height: height,\n            h: height,\n            x2: x + width,\n            y2: y + height,\n            cx: x + width / 2,\n            cy: y + height / 2,\n            r1: math.min(width, height) / 2,\n            r2: math.max(width, height) / 2,\n            r0: math.sqrt(width * width + height * height) / 2,\n            path: rectPath(x, y, width, height),\n            vb: [x, y, width, height].join(\" \")\n        };\n    }\n    function toString() {\n        return this.join(\",\").replace(p2s, \"$1\");\n    }\n    function pathClone(pathArray) {\n        var res = clone(pathArray);\n        res.toString = toString;\n        return res;\n    }\n    function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n                getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    }\n    function getLengthFactory(istotal, subpath) {\n        function O(val) {\n            return +(+val).toFixed(3);\n        }\n        return Snap._.cacher(function (path, length, onlystart) {\n            if (path instanceof Element) {\n                path = path.attr(\"d\");\n            }\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\n                                \"C\" + O(point.start.x),\n                                O(point.start.y),\n                                O(point.m.x),\n                                O(point.m.y),\n                                O(point.x),\n                                O(point.y)\n                            ];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\n                                \"M\" + O(point.x),\n                                O(point.y) + \"C\" + O(point.n.x),\n                                O(point.n.y),\n                                O(point.end.x),\n                                O(point.end.y),\n                                O(p[5]),\n                                O(p[6])\n                            ].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return point;\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            return point;\n        }, null, Snap._.clone);\n    }\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\n        // (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    }\n    function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!Snap.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return box(\n            bbox.min.x,\n            bbox.min.y,\n            bbox.max.x - bbox.min.x,\n            bbox.max.y - bbox.min.y\n        );\n    }\n    function isPointInsideBBox(bbox, x, y) {\n        return  x >= bbox.x &&\n                x <= bbox.x + bbox.width &&\n                y >= bbox.y &&\n                y <= bbox.y + bbox.height;\n    }\n    function isBBoxIntersect(bbox1, bbox2) {\n        bbox1 = box(bbox1);\n        bbox2 = box(bbox2);\n        return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n                || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n                || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    }\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = bezierBBox(bez1),\n            bbox2 = bezierBBox(bez2);\n        if (!isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = ~~(l1 / 5),\n            n2 = ~~(l2 / 5),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: t1,\n                                t2: t2\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function pathIntersection(path1, path2) {\n        return interPathHelper(path1, path2);\n    }\n    function pathIntersectionNumber(path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    }\n    function interPathHelper(path1, path2, justCount) {\n        path1 = path2curve(path1);\n        path2 = path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function isPointInsidePath(path, x, y) {\n        var bbox = pathBBox(path);\n        return isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    }\n    function pathBBox(path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return box();\n        }\n        path = path2curve(path);\n        var x = 0, \n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X.concat(dim.min.x, dim.max.x);\n                Y = Y.concat(dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin.apply(0, X),\n            ymin = mmin.apply(0, Y),\n            xmax = mmax.apply(0, X),\n            ymax = mmax.apply(0, Y),\n            bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n        pth.bbox = clone(bb);\n        return bb;\n    }\n    function rectPath(x, y, w, h, r) {\n        if (r) {\n            return [\n                [\"M\", x + r, y],\n                [\"l\", w - r * 2, 0],\n                [\"a\", r, r, 0, 0, 1, r, r],\n                [\"l\", 0, h - r * 2],\n                [\"a\", r, r, 0, 0, 1, -r, r],\n                [\"l\", r * 2 - w, 0],\n                [\"a\", r, r, 0, 0, 1, -r, -r],\n                [\"l\", 0, r * 2 - h],\n                [\"a\", r, r, 0, 0, 1, r, -r],\n                [\"z\"]\n            ];\n        }\n        var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        res.toString = toString;\n        return res;\n    }\n    function ellipsePath(x, y, rx, ry, a) {\n        if (a == null && ry == null) {\n            ry = rx;\n        }\n        if (a != null) {\n            var rad = Math.PI / 180,\n                x1 = x + rx * Math.cos(-ry * rad),\n                x2 = x + rx * Math.cos(-a * rad),\n                y1 = y + rx * Math.sin(-ry * rad),\n                y2 = y + rx * Math.sin(-a * rad),\n                res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n        } else {\n            res = [\n                [\"M\", x, y],\n                [\"m\", 0, -ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n                [\"z\"]\n            ];\n        }\n        res.toString = toString;\n        return res;\n    }\n    var unit2px = Snap._unit2px,\n        getPath = {\n        path: function (el) {\n            return el.attr(\"path\");\n        },\n        circle: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.r);\n        },\n        ellipse: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.rx, attr.ry);\n        },\n        rect: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height, attr.rx, attr.ry);\n        },\n        image: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height);\n        },\n        text: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        g: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        symbol: function (el) {\n            var bbox = el.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        polyline: function (el) {\n            return \"M\" + el.attr(\"points\");\n        },\n        polygon: function (el) {\n            return \"M\" + el.attr(\"points\") + \"z\";\n        }\n    };\n    function pathToRelative(pathArray) {\n        var pth = paths(pathArray),\n            lowerCase = String.prototype.toLowerCase;\n        if (pth.rel) {\n            return pathClone(pth.rel);\n        }\n        if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0;\n        if (pathArray[0][0] == \"M\") {\n            x = pathArray[0][1];\n            y = pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res.push([\"M\", x, y]);\n        }\n        for (var i = start, ii = pathArray.length; i < ii; i++) {\n            var r = res[i] = [],\n                pa = pathArray[i];\n            if (pa[0] != lowerCase.call(pa[0])) {\n                r[0] = lowerCase.call(pa[0]);\n                switch (r[0]) {\n                    case \"a\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] - x).toFixed(3);\n                        r[7] = +(pa[7] - y).toFixed(3);\n                        break;\n                    case \"v\":\n                        r[1] = +(pa[1] - y).toFixed(3);\n                        break;\n                    case \"m\":\n                        mx = pa[1];\n                        my = pa[2];\n                    default:\n                        for (var j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\n                        }\n                }\n            } else {\n                r = res[i] = [];\n                if (pa[0] == \"m\") {\n                    mx = pa[1] + x;\n                    my = pa[2] + y;\n                }\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    res[i][k] = pa[k];\n                }\n            }\n            var len = res[i].length;\n            switch (res[i][0]) {\n                case \"z\":\n                    x = mx;\n                    y = my;\n                    break;\n                case \"h\":\n                    x += +res[i][len - 1];\n                    break;\n                case \"v\":\n                    y += +res[i][len - 1];\n                    break;\n                default:\n                    x += +res[i][len - 2];\n                    y += +res[i][len - 1];\n            }\n        }\n        res.toString = toString;\n        pth.rel = pathClone(res);\n        return res;\n    }\n    function pathToAbsolute(pathArray) {\n        var pth = paths(pathArray);\n        if (pth.abs) {\n            return pathClone(pth.abs);\n        }\n        if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        if (!pathArray || !pathArray.length) {\n            return [[\"M\", 0, 0]];\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0,\n            pa0;\n        if (pathArray[0][0] == \"M\") {\n            x = +pathArray[0][1];\n            y = +pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res[0] = [\"M\", x, y];\n        }\n        var crz = pathArray.length == 3 &&\n            pathArray[0][0] == \"M\" &&\n            pathArray[1][0].toUpperCase() == \"R\" &&\n            pathArray[2][0].toUpperCase() == \"Z\";\n        for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n            res.push(r = []);\n            pa = pathArray[i];\n            pa0 = pa[0];\n            if (pa0 != pa0.toUpperCase()) {\n                r[0] = pa0.toUpperCase();\n                switch (r[0]) {\n                    case \"A\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] + x);\n                        r[7] = +(pa[7] + y);\n                        break;\n                    case \"V\":\n                        r[1] = +pa[1] + y;\n                        break;\n                    case \"H\":\n                        r[1] = +pa[1] + x;\n                        break;\n                    case \"R\":\n                        var dots = [x, y].concat(pa.slice(1));\n                        for (var j = 2, jj = dots.length; j < jj; j++) {\n                            dots[j] = +dots[j] + x;\n                            dots[++j] = +dots[j] + y;\n                        }\n                        res.pop();\n                        res = res.concat(catmullRom2bezier(dots, crz));\n                        break;\n                    case \"O\":\n                        res.pop();\n                        dots = ellipsePath(x, y, pa[1], pa[2]);\n                        dots.push(dots[0]);\n                        res = res.concat(dots);\n                        break;\n                    case \"U\":\n                        res.pop();\n                        res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                        r = [\"U\"].concat(res[res.length - 1].slice(-2));\n                        break;\n                    case \"M\":\n                        mx = +pa[1] + x;\n                        my = +pa[2] + y;\n                    default:\n                        for (j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +pa[j] + ((j % 2) ? x : y);\n                        }\n                }\n            } else if (pa0 == \"R\") {\n                dots = [x, y].concat(pa.slice(1));\n                res.pop();\n                res = res.concat(catmullRom2bezier(dots, crz));\n                r = [\"R\"].concat(pa.slice(-2));\n            } else if (pa0 == \"O\") {\n                res.pop();\n                dots = ellipsePath(x, y, pa[1], pa[2]);\n                dots.push(dots[0]);\n                res = res.concat(dots);\n            } else if (pa0 == \"U\") {\n                res.pop();\n                res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                r = [\"U\"].concat(res[res.length - 1].slice(-2));\n            } else {\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    r[k] = pa[k];\n                }\n            }\n            pa0 = pa0.toUpperCase();\n            if (pa0 != \"O\") {\n                switch (r[0]) {\n                    case \"Z\":\n                        x = mx;\n                        y = my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n        }\n        res.toString = toString;\n        pth.abs = pathClone(res);\n        return res;\n    }\n    function l2c(x1, y1, x2, y2) {\n        return [x1, y1, x2, y2, x2, y2];\n    }\n    function q2c(x1, y1, ax, ay, x2, y2) {\n        var _13 = 1 / 3,\n            _23 = 2 / 3;\n        return [\n                _13 * x1 + _23 * ax,\n                _13 * y1 + _23 * ay,\n                _13 * x2 + _23 * ax,\n                _13 * y2 + _23 * ay,\n                x2,\n                y2\n            ];\n    }\n    function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n        // for more information of where this math came from visit:\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        var _120 = PI * 120 / 180,\n            rad = PI / 180 * (+angle || 0),\n            res = [],\n            xy,\n            rotate = Snap._.cacher(function (x, y, rad) {\n                var X = x * math.cos(rad) - y * math.sin(rad),\n                    Y = x * math.sin(rad) + y * math.cos(rad);\n                return {x: X, y: Y};\n            });\n        if (!recursive) {\n            xy = rotate(x1, y1, -rad);\n            x1 = xy.x;\n            y1 = xy.y;\n            xy = rotate(x2, y2, -rad);\n            x2 = xy.x;\n            y2 = xy.y;\n            var cos = math.cos(PI / 180 * angle),\n                sin = math.sin(PI / 180 * angle),\n                x = (x1 - x2) / 2,\n                y = (y1 - y2) / 2;\n            var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n            if (h > 1) {\n                h = math.sqrt(h);\n                rx = h * rx;\n                ry = h * ry;\n            }\n            var rx2 = rx * rx,\n                ry2 = ry * ry,\n                k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                    math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                cx = k * rx * y / ry + (x1 + x2) / 2,\n                cy = k * -ry * x / rx + (y1 + y2) / 2,\n                f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n            f1 = x1 < cx ? PI - f1 : f1;\n            f2 = x2 < cx ? PI - f2 : f2;\n            f1 < 0 && (f1 = PI * 2 + f1);\n            f2 < 0 && (f2 = PI * 2 + f2);\n            if (sweep_flag && f1 > f2) {\n                f1 = f1 - PI * 2;\n            }\n            if (!sweep_flag && f2 > f1) {\n                f2 = f2 - PI * 2;\n            }\n        } else {\n            f1 = recursive[0];\n            f2 = recursive[1];\n            cx = recursive[2];\n            cy = recursive[3];\n        }\n        var df = f2 - f1;\n        if (abs(df) > _120) {\n            var f2old = f2,\n                x2old = x2,\n                y2old = y2;\n            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n            x2 = cx + rx * math.cos(f2);\n            y2 = cy + ry * math.sin(f2);\n            res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n        }\n        df = f2 - f1;\n        var c1 = math.cos(f1),\n            s1 = math.sin(f1),\n            c2 = math.cos(f2),\n            s2 = math.sin(f2),\n            t = math.tan(df / 4),\n            hx = 4 / 3 * rx * t,\n            hy = 4 / 3 * ry * t,\n            m1 = [x1, y1],\n            m2 = [x1 + hx * s1, y1 - hy * c1],\n            m3 = [x2 + hx * s2, y2 - hy * c2],\n            m4 = [x2, y2];\n        m2[0] = 2 * m1[0] - m2[0];\n        m2[1] = 2 * m1[1] - m2[1];\n        if (recursive) {\n            return [m2, m3, m4].concat(res);\n        } else {\n            res = [m2, m3, m4].concat(res).join().split(\",\");\n            var newres = [];\n            for (var i = 0, ii = res.length; i < ii; i++) {\n                newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n            }\n            return newres;\n        }\n    }\n    function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t;\n        return {\n            x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n            y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n        };\n    }\n    function curveDim(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\n            b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\n            c = p1x - c1x,\n            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            y = [p1y, p2y],\n            x = [p1x, p2x],\n            dot;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\n        b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\n        c = p1y - c1y;\n        t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        return {\n            min: {x: mmin.apply(0, x), y: mmin.apply(0, y)},\n            max: {x: mmax.apply(0, x), y: mmax.apply(0, y)}\n        };\n    }\n    function path2curve(path, path2) {\n        var pth = !path2 && paths(path);\n        if (!path2 && pth.curve) {\n            return pathClone(pth.curve);\n        }\n        var p = pathToAbsolute(path),\n            p2 = path2 && pathToAbsolute(path2),\n            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            processPath = function (path, d) {\n                var nx, ny;\n                if (!path) {\n                    return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                }\n                !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);\n                switch (path[0]) {\n                    case \"M\":\n                        d.X = path[1];\n                        d.Y = path[2];\n                        break;\n                    case \"A\":\n                        path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n                        break;\n                    case \"S\":\n                        nx = d.x + (d.x - (d.bx || d.x));\n                        ny = d.y + (d.y - (d.by || d.y));\n                        path = [\"C\", nx, ny].concat(path.slice(1));\n                        break;\n                    case \"T\":\n                        d.qx = d.x + (d.x - (d.qx || d.x));\n                        d.qy = d.y + (d.y - (d.qy || d.y));\n                        path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                        break;\n                    case \"Q\":\n                        d.qx = path[1];\n                        d.qy = path[2];\n                        path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                        break;\n                    case \"L\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n                        break;\n                    case \"H\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n                        break;\n                    case \"V\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n                        break;\n                    case \"Z\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n                        break;\n                }\n                return path;\n            },\n            fixArc = function (pp, i) {\n                if (pp[i].length > 7) {\n                    pp[i].shift();\n                    var pi = pp[i];\n                    while (pi.length) {\n                        pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n                    }\n                    pp.splice(i, 1);\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            fixM = function (path1, path2, a1, a2, i) {\n                if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                    path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                    a1.bx = 0;\n                    a1.by = 0;\n                    a1.x = path1[i][1];\n                    a1.y = path1[i][2];\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            };\n        for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n            p[i] = processPath(p[i], attrs);\n            fixArc(p, i);\n            p2 && (p2[i] = processPath(p2[i], attrs2));\n            p2 && fixArc(p2, i);\n            fixM(p, p2, attrs, attrs2, i);\n            fixM(p2, p, attrs2, attrs, i);\n            var seg = p[i],\n                seg2 = p2 && p2[i],\n                seglen = seg.length,\n                seg2len = p2 && seg2.length;\n            attrs.x = seg[seglen - 2];\n            attrs.y = seg[seglen - 1];\n            attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n            attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n            attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n            attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n            attrs2.x = p2 && seg2[seg2len - 2];\n            attrs2.y = p2 && seg2[seg2len - 1];\n        }\n        if (!p2) {\n            pth.curve = pathClone(p);\n        }\n        return p2 ? [p, p2] : p;\n    }\n    function mapPath(path, matrix) {\n        if (!matrix) {\n            return path;\n        }\n        var x, y, i, j, ii, jj, pathi;\n        path = path2curve(path);\n        for (i = 0, ii = path.length; i < ii; i++) {\n            pathi = path[i];\n            for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                x = matrix.x(pathi[j], pathi[j + 1]);\n                y = matrix.y(pathi[j], pathi[j + 1]);\n                pathi[j] = x;\n                pathi[j + 1] = y;\n            }\n        }\n        return path;\n    }\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n\n    // export\n    Snap.path = paths;\n\n    /*\\\n     * Snap.path.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the given path in pixels\n     **\n     - path (string) SVG path string\n     **\n     = (number) length\n    \\*/\n    Snap.path.getTotalLength = getTotalLength;\n    /*\\\n     * Snap.path.getPointAtLength\n     [ method ]\n     **\n     * Returns the coordinates of the point located at the given length along the given path\n     **\n     - path (string) SVG path string\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    Snap.path.getPointAtLength = getPointAtLength;\n    /*\\\n     * Snap.path.getSubpath\n     [ method ]\n     **\n     * Returns the subpath of a given path between given start and end lengths\n     **\n     - path (string) SVG path string\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    Snap.path.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the path in pixels (only works for `path` elements)\n     = (number) length\n    \\*/\n    elproto.getTotalLength = function () {\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n    };\n    // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a <path> is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n     **\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        return getPointAtLength(this.attr(\"d\"), length);\n    };\n    // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n     **\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n    };\n    Snap._.box = box;\n    /*\\\n     * Snap.path.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds dot coordinates on the given cubic beziér curve at the given t\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point,\n     o     y: (number) y coordinate of the point,\n     o     m: {\n     o         x: (number) x coordinate of the left anchor,\n     o         y: (number) y coordinate of the left anchor\n     o     },\n     o     n: {\n     o         x: (number) x coordinate of the right anchor,\n     o         y: (number) y coordinate of the right anchor\n     o     },\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve,\n     o         y: (number) y coordinate of the start of the curve\n     o     },\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve,\n     o         y: (number) y coordinate of the end of the curve\n     o     },\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    Snap.path.findDotsAtSegment = findDotsAtSegment;\n    /*\\\n     * Snap.path.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given cubic beziér curve\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for beziér curve\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.bezierBBox = bezierBBox;\n    /*\\\n     * Snap.path.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding box\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point is inside\n    \\*/\n    Snap.path.isPointInsideBBox = isPointInsideBBox;\n    /*\\\n     * Snap.path.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if bounding boxes intersect\n    \\*/\n    Snap.path.isBBoxIntersect = isBBoxIntersect;\n    /*\\\n     * Snap.path.intersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point,\n     o         y: (number) y coordinate of the point,\n     o         t1: (number) t value for segment of path1,\n     o         t2: (number) t value for segment of path2,\n     o         segment1: (number) order number for segment of path1,\n     o         segment2: (number) order number for segment of path2,\n     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    Snap.path.intersection = pathIntersection;\n    Snap.path.intersectionNumber = pathIntersectionNumber;\n    /*\\\n     * Snap.path.isPointInside\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     *\n     * Note: fill mode doesn’t affect the result of this method.\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) `true` if point is inside the path\n    \\*/\n    Snap.path.isPointInside = isPointInsidePath;\n    /*\\\n     * Snap.path.getBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given path\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.getBBox = pathBBox;\n    Snap.path.get = getPath;\n    /*\\\n     * Snap.path.toRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into relative values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toRelative = pathToRelative;\n    /*\\\n     * Snap.path.toAbsolute\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into absolute values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toAbsolute = pathToAbsolute;\n    /*\\\n     * Snap.path.toCubic\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic beziér curves\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments\n    \\*/\n    Snap.path.toCubic = path2curve;\n    /*\\\n     * Snap.path.map\n     [ method ]\n     **\n     * Transform the path string with the given matrix\n     - path (string) path string\n     - matrix (object) see @Matrix\n     = (string) transformed path string\n    \\*/\n    Snap.path.map = mapPath;\n    Snap.path.toString = toString;\n    Snap.path.clone = pathClone;\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var mmax = Math.max,\n        mmin = Math.min;\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i]) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set\n     *\n     * If the function returns `false`, the loop stops running.\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    setproto.attr = function (value) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            this.items[i].attr(value);\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes range of elements from the set\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion… (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found and removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n        return false;\n    };\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin.apply(0, x);\n        y = mmin.apply(0, y);\n        x2 = mmax.apply(0, x2);\n        y2 = mmax.apply(0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y,\n            cx: x + (x2 - x) / 2,\n            cy: y + (y2 - y) / 2\n        };\n    };\n    setproto.clone = function (s) {\n        s = new Set;\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Snap\\u2018s set\";\n    };\n    setproto.type = \"set\";\n    // export\n    Snap.set = function () {\n        var set = new Set;\n        if (arguments.length) {\n            set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n        }\n        return set;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var names = {},\n        reUnit = /[a-z]+$/i,\n        Str = String;\n    names.stroke = names.fill = \"colour\";\n    function getEmpty(item) {\n        var l = item[0];\n        switch (l.toLowerCase()) {\n            case \"t\": return [l, 0, 0];\n            case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n            case \"r\": if (item.length == 4) {\n                return [l, 0, item[2], item[3]];\n            } else {\n                return [l, 0];\n            }\n            case \"s\": if (item.length == 5) {\n                return [l, 1, 1, item[3], item[4]];\n            } else if (item.length == 3) {\n                return [l, 1, 1];\n            } else {\n                return [l, 1];\n            }\n        }\n    }\n    function equaliseTransform(t1, t2, getBBox) {\n        t2 = Str(t2).replace(/\\.{3}|\\u2026/g, t1);\n        t1 = Snap.parseTransformString(t1) || [];\n        t2 = Snap.parseTransformString(t2) || [];\n        var maxlength = Math.max(t1.length, t2.length),\n            from = [],\n            to = [],\n            i = 0, j, jj,\n            tt1, tt2;\n        for (; i < maxlength; i++) {\n            tt1 = t1[i] || getEmpty(t2[i]);\n            tt2 = t2[i] || getEmpty(tt1);\n            if ((tt1[0] != tt2[0]) ||\n                (tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\n                (tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\n                ) {\n                    t1 = Snap._.transform2matrix(t1, getBBox());\n                    t2 = Snap._.transform2matrix(t2, getBBox());\n                    from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n                    to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n                    break;\n            }\n            from[i] = [];\n            to[i] = [];\n            for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n                j in tt1 && (from[i][j] = tt1[j]);\n                j in tt2 && (to[i][j] = tt2[j]);\n            }\n        }\n        return {\n            from: path2array(from),\n            to: path2array(to),\n            f: getPath(from)\n        };\n    }\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    function getColour(clr) {\n        return Snap.rgb(clr[0], clr[1], clr[2]);\n    }\n    function getPath(path) {\n        var k = 0, i, ii, j, jj, out, a, b = [];\n        for (i = 0, ii = path.length; i < ii; i++) {\n            out = \"[\";\n            a = ['\"' + path[i][0] + '\"'];\n            for (j = 1, jj = path[i].length; j < jj; j++) {\n                a[j] = \"val[\" + (k++) + \"]\";\n            }\n            out += a + \"]\";\n            b[i] = out;\n        }\n        return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n    }\n    function path2array(path) {\n        var out = [];\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            for (var j = 1, jj = path[i].length; j < jj; j++) {\n                out.push(path[i][j]);\n            }\n        }\n        return out;\n    }\n    Element.prototype.equal = function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this;\n        if (a == +a && b == +b) {\n            return {\n                from: +a,\n                to: +b,\n                f: getNumber\n            };\n        }\n        if (names[name] == \"colour\") {\n            A = Snap.color(a);\n            B = Snap.color(b);\n            return {\n                from: [A.r, A.g, A.b, A.opacity],\n                to: [B.r, B.g, B.b, B.opacity],\n                f: getColour\n            };\n        }\n        if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n            // TODO: b could be an SVG transform string or matrix\n            return equaliseTransform(a, b, function () {\n                return el.getBBox(1);\n            });\n        }\n        if (name == \"d\" || name == \"path\") {\n            A = Snap.path.toCubic(a, b);\n            return {\n                from: path2array(A[0]),\n                to: path2array(A[1]),\n                f: getPath(A[0])\n            };\n        }\n        var aUnit = a.match(reUnit),\n            bUnit = b.match(reUnit);\n        if (aUnit && aUnit == bUnit) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getUnit(aUnit)\n            };\n        } else {\n            return {\n                from: this.asPX(name),\n                to: this.asPX(name, b),\n                f: getNumber\n            };\n        }\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n    has = \"hasOwnProperty\",\n    supportsTouch = \"createTouch\" in glob.doc,\n    events = [\n        \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n        \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n        \"touchcancel\"\n    ],\n    touchMap = {\n        mousedown: \"touchstart\",\n        mousemove: \"touchmove\",\n        mouseup: \"touchend\"\n    },\n    getScroll = function (xy) {\n        var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\";\n        return glob.doc.documentElement[name] || glob.doc.body[name];\n    },\n    preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    addEvent = (function () {\n        if (glob.doc.addEventListener) {\n            return function (obj, type, fn, element) {\n                var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n                    f = function (e) {\n                        var scrollY = getScroll(\"y\"),\n                            scrollX = getScroll(\"x\"),\n                            x = e.clientX + scrollX,\n                            y = e.clientY + scrollY;\n                    if (supportsTouch && touchMap[has](type)) {\n                        for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n                            if (e.targetTouches[i].target == obj) {\n                                var olde = e;\n                                e = e.targetTouches[i];\n                                e.originalEvent = olde;\n                                e.preventDefault = preventTouch;\n                                e.stopPropagation = stopTouch;\n                                break;\n                            }\n                        }\n                    }\n                    return fn.call(element, e, x, y);\n                };\n                obj.addEventListener(realName, f, false);\n                return function () {\n                    obj.removeEventListener(realName, f, false);\n                    return true;\n                };\n            };\n        } else if (glob.doc.attachEvent) {\n            return function (obj, type, fn, element) {\n                var f = function (e) {\n                    e = e || glob.win.event;\n                    var scrollY = getScroll(\"y\"),\n                        scrollX = getScroll(\"x\"),\n                        x = e.clientX + scrollX,\n                        y = e.clientY + scrollY;\n                    e.preventDefault = e.preventDefault || preventDefault;\n                    e.stopPropagation = e.stopPropagation || stopPropagation;\n                    return fn.call(element, e, x, y);\n                };\n                obj.attachEvent(\"on\" + type, f);\n                var detacher = function () {\n                    obj.detachEvent(\"on\" + type, f);\n                    return true;\n                };\n                return detacher;\n            };\n        }\n    })(),\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = getScroll(\"y\"),\n            scrollX = getScroll(\"x\"),\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch) {\n                var i = e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                glob = Snap._.glob,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            // glob.win.opera && parent.removeChild(node);\n            // node.style.display = \"none\";\n            // o = dragi.el.paper.getElementByPoint(x, y);\n            // node.style.display = display;\n            // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        Snap.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n        }\n        drag = [];\n    };\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds a click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes a click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds a double click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes a double click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds a mousedown event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes a mousedown event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds a mousemove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes a mousemove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds a mouseout event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes a mouseout event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds a mouseover event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes a mouseover event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds a mouseup event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes a mouseup event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds a touchstart event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes a touchstart event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds a touchmove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes a touchmove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds a touchend event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes a touchend event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds a touchcancel event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes a touchcancel event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            Snap[eventName] = elproto[eventName] = function (fn, scope) {\n                if (Snap.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({\n                        name: eventName,\n                        f: fn,\n                        unbind: addEvent(this.shape || this.node || glob.doc, eventName, fn, scope || this)\n                    });\n                }\n                return this;\n            };\n            Snap[\"un\" + eventName] =\n            elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--) if (events[l].name == eventName &&\n                               (events[l].f == fn || !fn)) {\n                    events[l].unbind();\n                    events.splice(l, 1);\n                    !events.length && delete this.events;\n                    return this;\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds hover event handlers to the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes hover event handlers from the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n    // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n    // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n    // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start.<id> on start, drag.end.<id> on end and drag.move.<id> on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for an element's drag gesture\n     **\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionaly following `drag` events are triggered: `drag.start.<id>` on start, \n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element is dragged over another element \n     * `drag.over.<id>` fires as well.\n     *\n     * Start event and start handler are called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler are called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler are called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        if (!arguments.length) {\n            var origTransform;\n            return this.drag(function (dx, dy) {\n                this.attr({\n                    transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n                });\n            }, function () {\n                origTransform = this.transform().local;\n            });\n        }\n        function start(e) {\n            (e.originalEvent || e).preventDefault();\n            var scrollY = getScroll(\"y\"),\n                scrollX = getScroll(\"x\");\n            this._drag.x = e.clientX + scrollX;\n            this._drag.y = e.clientY + scrollY;\n            this._drag.id = e.identifier;\n            !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"snap.drag.start.\" + this.id, onstart);\n            onmove && eve.on(\"snap.drag.move.\" + this.id, onmove);\n            onend && eve.on(\"snap.drag.end.\" + this.id, onend);\n            eve(\"snap.drag.start.\" + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);\n        }\n        this._drag = {};\n        draggable.push({el: this, start: start});\n        this.mousedown(start);\n        return this;\n    };\n    /*\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut to assign event handler for `drag.over.<id>` event, where `id` is the element's `id` (see @Element.id)\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    // elproto.onDragOver = function (f) {\n    //     f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n    // };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from the given element\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].start);\n            draggable.splice(i, 1);\n            eve.unbind(\"snap.drag.*.\" + this.id);\n        }\n        !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n        return this;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        pproto = Paper.prototype,\n        rgurl = /^\\s*url\\((.+)\\)/,\n        Str = String,\n        $ = Snap._.$;\n    Snap.filter = {};\n// SIERRA Paper.filter(): I don't understand the note. Does that mean an HTML should dedicate a separate SVG region for a filter definition? What's the advantage over a DEFS?\n    /*\\\n     * Paper.filter\n     [ method ]\n     **\n     * Creates a `<filter>` element\n     **\n     - filstr (string) SVG fragment of filter provided as a string\n     = (object) @Element\n     * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n     > Usage\n     | var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    pproto.filter = function (filstr) {\n        var paper = this;\n        if (paper.type != \"svg\") {\n            paper = paper.paper;\n        }\n        var f = Snap.parse(Str(filstr)),\n            id = Snap._.id(),\n            width = paper.node.offsetWidth,\n            height = paper.node.offsetHeight,\n            filter = $(\"filter\");\n        $(filter, {\n            id: id,\n            filterUnits: \"userSpaceOnUse\",\n            x: 0,\n            y: 0,\n            width: width,\n            height: height\n        });\n        filter.appendChild(f.node);\n        paper.defs.appendChild(filter);\n        return new Element(filter);\n    };\n    \n    eve.on(\"snap.util.getattr.filter\", function () {\n        eve.stop();\n        var p = $(this.node, \"filter\");\n        if (p) {\n            var match = Str(p).match(rgurl);\n            return match && Snap.select(match[1]);\n        }\n    });\n    eve.on(\"snap.util.attr.filter\", function (value) {\n        if (value instanceof Element && value.type == \"filter\") {\n            eve.stop();\n            var id = value.node.id;\n            if (!id) {\n                $(value.node, {id: value.id});\n                id = value.id;\n            }\n            $(this.node, {\n                filter: \"url(#\" + id + \")\"\n            });\n        }\n        if (!value || value == \"none\") {\n            eve.stop();\n            this.node.removeAttribute(\"filter\");\n        }\n    });\n    // SIERRA Would help to clarify when various Snap.filter.* matches the behavior of CSS filter property keyword functions. E.g., I don't think CSS's blur() accepts a second parameter for y axis.\n    // SIERRA Would also be useful to illustrate a chain of >1 filter as a code snippet.\n    /*\\\n     * Snap.filter.blur\n     [ method ]\n     **\n     * Returns an SVG markup string for the blur filter\n     **\n     - x (number) amount of horizontal blur, in pixels\n     - y (number) #optional amount of vertical blur, in pixels\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.blur(5, 10)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.blur = function (x, y) {\n        if (x == null) {\n            x = 2;\n        }\n        var def = y == null ? x : [x, y];\n        return Snap.format('\\<feGaussianBlur stdDeviation=\"{def}\"/>', {\n            def: def\n        });\n    };\n    Snap.filter.blur.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.shadow\n     [ method ]\n     **\n     * Returns an SVG markup string for the shadow filter\n     **\n     - dx (number) horizontal shift of the shadow, in pixels\n     - dy (number) vertical shift of the shadow, in pixels\n     - blur (number) #optional amount of blur\n     - color (string) #optional color of the shadow\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.shadow(0, 2, 3)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.shadow = function (dx, dy, blur, color) {\n        color = color || \"#000\";\n        if (blur == null) {\n            blur = 4;\n        }\n        if (typeof blur == \"string\") {\n            color = blur;\n            blur = 4;\n        }\n        if (dx == null) {\n            dx = 0;\n            dy = 2;\n        }\n        if (dy == null) {\n            dy = dx;\n        }\n        color = Snap.color(color);\n        return Snap.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>', {\n            color: color,\n            dx: dx,\n            dy: dy,\n            blur: blur\n        });\n    };\n    Snap.filter.shadow.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.grayscale\n     [ method ]\n     **\n     * Returns an SVG markup string for the grayscale filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.grayscale = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>', {\n            a: 0.2126 + 0.7874 * (1 - amount),\n            b: 0.7152 - 0.7152 * (1 - amount),\n            c: 0.0722 - 0.0722 * (1 - amount),\n            d: 0.2126 - 0.2126 * (1 - amount),\n            e: 0.7152 + 0.2848 * (1 - amount),\n            f: 0.0722 - 0.0722 * (1 - amount),\n            g: 0.2126 - 0.2126 * (1 - amount),\n            h: 0.0722 + 0.9278 * (1 - amount)\n        });\n    };\n    Snap.filter.grayscale.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.sepia\n     [ method ]\n     **\n     * Returns an SVG markup string for the sepia filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.sepia = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>', {\n            a: 0.393 + 0.607 * (1 - amount),\n            b: 0.769 - 0.769 * (1 - amount),\n            c: 0.189 - 0.189 * (1 - amount),\n            d: 0.349 - 0.349 * (1 - amount),\n            e: 0.686 + 0.314 * (1 - amount),\n            f: 0.168 - 0.168 * (1 - amount),\n            g: 0.272 - 0.272 * (1 - amount),\n            h: 0.534 - 0.534 * (1 - amount),\n            i: 0.131 + 0.869 * (1 - amount)\n        });\n    };\n    Snap.filter.sepia.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.saturate\n     [ method ]\n     **\n     * Returns an SVG markup string for the saturate filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.saturate = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>', {\n            amount: 1 - amount\n        });\n    };\n    Snap.filter.saturate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.hueRotate\n     [ method ]\n     **\n     * Returns an SVG markup string for the hue-rotate filter\n     **\n     - angle (number) angle of rotation\n     = (string) filter representation\n    \\*/\n    Snap.filter.hueRotate = function (angle) {\n        angle = angle || 0;\n        return Snap.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>', {\n            angle: angle\n        });\n    };\n    Snap.filter.hueRotate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.invert\n     [ method ]\n     **\n     * Returns an SVG markup string for the invert filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.invert = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: 1 - amount\n        });\n    };\n    Snap.filter.invert.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.brightness\n     [ method ]\n     **\n     * Returns an SVG markup string for the brightness filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.brightness = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>', {\n            amount: amount\n        });\n    };\n    Snap.filter.brightness.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.contrast\n     [ method ]\n     **\n     * Returns an SVG markup string for the contrast filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.contrast = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: .5 - amount / 2\n        });\n    };\n    Snap.filter.contrast.toString = function () {\n        return this();\n    };\n});\nreturn Snap;\n}));"
  },
  {
    "path": "demos/animated-game/js/tree-face.js",
    "content": "\nvar TreeFace = Backbone.View.extend({\n\tinitialize: function () {\n\t\tthis.s = this.options.s;\n\t\tthis.el = this.options.tree;\n\t\t\n\t\tthis.addFace();\n\t\t\n\t\t/*\n\t\tsetTimeout(function () {\n\t\t\tthis.face.attr({\n\t\t\t\t'class': 'face animating'\n\t\t\t});\n\t\t}.bind(this), Math.random() * 2000 );\n\t\t*/\n\t\t\n\t\tthis.hitarea = this.s.circle(0, 0, 40);\n\t\tthis.hitarea.attr({\n\t\t\tfill: 'transparent',\n\t\t\t'class': 'hit-area'\n\t\t});\n\t\tthis.face.add(this.hitarea);\n\t\tthis.hitarea.mouseover(this.handle_MOUSEOVER.bind(this));\n\t\tthis.hitarea.mouseout(this.handle_MOUSEOUT.bind(this));\n\t},\n\t\n\thandle_MOUSEOVER: function () {\n\t\tthis.face.attr({\n\t\t\t'class': 'face animating'\n\t\t});\t\n\t},\n\t\n\thandle_MOUSEOUT: function () {\n\t\tthis.face.attr({\n\t\t\t'class': 'face'\n\t\t});\n\t},\n\t\n\taddFace: function () {\n\t\tvar mouth,\n\t\t\teye,\n\t\t\tey2,\n\t\t\tmatrix;\n\t\t\n\t\tthis.face = this.s.g();\n\t\tthis.face.attr({\n\t\t\t'class': 'face'\n\t\t});\n\t\t/*\n\t\tmouth = this.s.circle(0, 5, 4);\n\t\tmouth.attr({fill: 'black', 'class': 'mouth'});\n\t\tthis.face.add(mouth);\n\t\t*/\n\t\teye = this.s.path('M-2.75-6.75c0,0-2.537,2.5-5.667,2.5s-5.667-2.5-5.667-2.5s2.537-2.5,5.667-2.5S-2.75-6.75-2.75-6.75z');\n\t\teye.attr({fill: 'white', 'class': 'eye left'});\n\t\tthis.face.add(eye);\n\t\t\n\t\teye2 = this.s.path('M14.583-6.75c0,0-2.537,2.5-5.667,2.5S3.25-6.75,3.25-6.75s2.537-2.5,5.667-2.5S14.583-6.75,14.583-6.75z');\n\t\teye2.attr({fill: 'white', 'class': 'eye right'});\n\t\tthis.face.add(eye2);\n\t\t\n\t\tmatrix = new Snap.Matrix();\n\t\tbox = this.el.getBBox();\n\t\tmatrix.translate(box.cx, box.cy);\n\t\tmatrix.scale(box.r2 / 40);\n\t\t\n\t\tthis.face.transform(matrix.toTransformString());\n\t\tthis.el.add(this.face);\n\t},\n});\n"
  },
  {
    "path": "demos/animated-game/js/underscore.js",
    "content": "//     Underscore.js 1.4.4\n//     http://underscorejs.org\n//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var push             = ArrayProto.push,\n      slice            = ArrayProto.slice,\n      concat           = ArrayProto.concat,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.4.4';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = obj.length; i < l; i++) {\n        if (iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    return results;\n  };\n\n  var reduceError = 'Reduce of empty array with no initial value';\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var length = obj.length;\n    if (length !== +length) {\n      var keys = _.keys(obj);\n      length = keys.length;\n    }\n    each(obj, function(value, index, list) {\n      index = keys ? keys[--length] : --length;\n      if (!initial) {\n        memo = obj[index];\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, obj[index], index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    return _.filter(obj, function(value, index, list) {\n      return !iterator.call(context, value, index, list);\n    }, context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if the array or object contains a given value (using `===`).\n  // Aliased as `include`.\n  _.contains = _.include = function(obj, target) {\n    if (obj == null) return false;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    return any(obj, function(value) {\n      return value === target;\n    });\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      return (isFunc ? method : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs, first) {\n    if (_.isEmpty(attrs)) return first ? null : [];\n    return _[first ? 'find' : 'filter'](obj, function(value) {\n      for (var key in attrs) {\n        if (attrs[key] !== value[key]) return false;\n      }\n      return true;\n    });\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.where(obj, attrs, true);\n  };\n\n  // Return the maximum element or (element-based computation).\n  // Can't optimize arrays of integers longer than 65,535 elements.\n  // See: https://bugs.webkit.org/show_bug.cgi?id=80797\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.max.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity, value: -Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.min.apply(Math, obj);\n    }\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity, value: Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var rand;\n    var index = 0;\n    var shuffled = [];\n    each(obj, function(value) {\n      rand = _.random(index++);\n      shuffled[index - 1] = shuffled[rand];\n      shuffled[rand] = value;\n    });\n    return shuffled;\n  };\n\n  // An internal function to generate lookup iterators.\n  var lookupIterator = function(value) {\n    return _.isFunction(value) ? value : function(obj){ return obj[value]; };\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, value, context) {\n    var iterator = lookupIterator(value);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        index : index,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index < right.index ? -1 : 1;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(obj, value, context, behavior) {\n    var result = {};\n    var iterator = lookupIterator(value || _.identity);\n    each(obj, function(value, index) {\n      var key = iterator.call(context, value, index, obj);\n      behavior(result, key, value);\n    });\n    return result;\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key, value) {\n      (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n    });\n  };\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = function(obj, value, context) {\n    return group(obj, value, context, function(result, key) {\n      if (!_.has(result, key)) result[key] = 0;\n      result[key]++;\n    });\n  };\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator, context) {\n    iterator = iterator == null ? _.identity : lookupIterator(iterator);\n    var value = iterator.call(context, obj);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >>> 1;\n      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (obj.length === +obj.length) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if ((n != null) && !guard) {\n      return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, (n == null) || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, output) {\n    each(input, function(value) {\n      if (_.isArray(value)) {\n        shallow ? push.apply(output, value) : flatten(value, shallow, output);\n      } else {\n        output.push(value);\n      }\n    });\n    return output;\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, []);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator, context) {\n    if (_.isFunction(isSorted)) {\n      context = iterator;\n      iterator = isSorted;\n      isSorted = false;\n    }\n    var initial = iterator ? _.map(array, iterator, context) : array;\n    var results = [];\n    var seen = [];\n    each(initial, function(value, index) {\n      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n        seen.push(value);\n        results.push(array[index]);\n      }\n    });\n    return results;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(concat.apply(ArrayProto, arguments));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.contains(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) {\n      results[i] = _.pluck(args, \"\" + i);\n    }\n    return results;\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    if (list == null) return {};\n    var result = {};\n    for (var i = 0, l = list.length; i < l; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i = 0, l = array.length;\n    if (isSorted) {\n      if (typeof isSorted == 'number') {\n        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n      } else {\n        i = _.sortedIndex(array, item);\n        return array[i] === item ? i : -1;\n      }\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n    for (; i < l; i++) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = function(array, item, from) {\n    if (array == null) return -1;\n    var hasIndex = from != null;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n    }\n    var i = (hasIndex ? from : array.length);\n    while (i--) if (array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    var args = slice.call(arguments, 2);\n    return function() {\n      return func.apply(context, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context.\n  _.partial = function(func) {\n    var args = slice.call(arguments, 1);\n    return function() {\n      return func.apply(this, args.concat(slice.call(arguments)));\n    };\n  };\n\n  // Bind all of an object's methods to that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length === 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(null, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, result;\n    var previous = 0;\n    var later = function() {\n      previous = new Date;\n      timeout = null;\n      result = func.apply(context, args);\n    };\n    return function() {\n      var now = new Date;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0) {\n        clearTimeout(timeout);\n        timeout = null;\n        previous = now;\n        result = func.apply(context, args);\n      } else if (!timeout) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, result;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        if (!immediate) result = func.apply(context, args);\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) result = func.apply(context, args);\n      return result;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      memo = func.apply(this, arguments);\n      func = null;\n      return memo;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func];\n      push.apply(args, arguments);\n      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var values = [];\n    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);\n    return values;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var pairs = [];\n    for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    each(keys, function(key) {\n      if (key in obj) copy[key] = obj[key];\n    });\n    return copy;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    for (var key in obj) {\n      if (!_.contains(keys, key)) copy[key] = obj[key];\n    }\n    return copy;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          if (obj[prop] == null) obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] == a) return bStack[length] == b;\n    }\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent, but `Object`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n                               _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n        return false;\n      }\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n          // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return result;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, [], []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) == '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Optimize `isFunction` if appropriate.\n  if (typeof (/./) !== 'function') {\n    _.isFunction = function(obj) {\n      return typeof obj === 'function';\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj != +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iterator, context) {\n    var accum = Array(n);\n    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // List of HTML entities for escaping.\n  var entityMap = {\n    escape: {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#x27;',\n      '/': '&#x2F;'\n    }\n  };\n  entityMap.unescape = _.invert(entityMap.escape);\n\n  // Regexes containing the keys and values listed immediately above.\n  var entityRegexes = {\n    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n  };\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  _.each(['escape', 'unescape'], function(method) {\n    _[method] = function(string) {\n      if (string == null) return '';\n      return ('' + string).replace(entityRegexes[method], function(match) {\n        return entityMap[method][match];\n      });\n    };\n  });\n\n  // If the value of the named property is a function then invoke it;\n  // otherwise, return it.\n  _.result = function(object, property) {\n    if (object == null) return null;\n    var value = object[property];\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result.call(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\t':     't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(text, data, settings) {\n    var render;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = new RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset)\n        .replace(escaper, function(match) { return '\\\\' + escapes[match]; });\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      }\n      if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      }\n      if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n      index = offset + match.length;\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + \"return __p;\\n\";\n\n    try {\n      render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    if (data) return render(data, _);\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled function source as a convenience for precompilation.\n    template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj) {\n    return this._chain ? _(obj).chain() : obj;\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n      return result.call(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result.call(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  _.extend(_.prototype, {\n\n    // Start chaining a wrapped Underscore object.\n    chain: function() {\n      this._chain = true;\n      return this;\n    },\n\n    // Extracts the result from a wrapped and chained object.\n    value: function() {\n      return this._wrapped;\n    }\n\n  });\n\n  // AMD define happens at the end for compatibility with AMD loaders\n  // that don't enforce next-turn semantics on modules.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', function() {\n      return _;\n    });\n  }\n\n}).call(this);\n"
  },
  {
    "path": "demos/animated-map/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Long Flight</title>\n        <style media=\"screen\">\n        body {\n            background: #2c4e6b;\n        }\n        </style>\n        <script src=\"../../dist/snap.svg.js\"></script>\n        <script>\n        window.onload = function () {\n            var g = Snap();\n            g.attr({\n                viewBox: [0, 0, 800, 600]\n            });\n            \n            Snap.load(\"map.svg\", function (f) {\n                function getShift(dot) {\n                    return \"t\" + (400 - dot.x) + \",\" + (300 - dot.y);\n                }\n                var gr = f.select(\"g\"),\n                    wrd = f.select(\"#world\").attr({fill: \"#fff\"}),\n                    syd = f.select(\"#sydney\").attr({fill: \"red\"}),\n                    msk = f.select(\"#san_francisco\").attr({fill: \"red\"}),\n                    pth = f.select(\"#flight\"),\n                    pln = f.select(\"#plane\"),\n                    top = g.g();\n                top.attr({\n                    mask: g.rect(100, 0, 600, 600).attr({\n                        fill: \"r(.5,.5,.25)#fff-#000\"\n                    })\n                });\n                top.add(gr);\n                var click = top.text(410, 310, \"click!\").attr({\n                    font: \"20px Source Sans Pro, sans-serif\",\n                    fill: \"#fff\"\n                });\n                pth.attr({\n                    display: \"none\"\n                });\n                pln = gr.g(pln, pln.clone());\n                pln.attr({\n                    display: \"none\"\n                });\n                pln[0].attr({\n                    stroke: \"#fff\",\n                    strokeWidth: 2\n                });\n                gr.attr({\n                    transform: getShift({\n                        x: syd.attr(\"cx\"),\n                        y: syd.attr(\"cy\")\n                    })\n                });\n                var flight = gr.path().attr({\n                    fill: \"none\",\n                    stroke: \"red\",\n                    strokeWidth: 3,\n                    strokeDasharray: \"5 3\"\n                }).insertBefore(pln);\n                window.onclick = function () {\n                    pln.attr({\n                        display: \"\"\n                    });\n                    click.attr({\n                        display: \"none\"\n                    });\n                    var flag,\n                        len = Snap.path.getTotalLength(pth.attr(\"d\"));\n                    Snap.animate(0, len, function (l) {\n                        // Safari bug workaround: forcing redraw\n                        g.attr({width: 100 + (flag = !flag ? 1e-5 : 0) + \"%\"});\n                        //\n                        var dot = pth.getPointAtLength(l);\n                        flight.attr({\n                            d: pth.getSubpath(0, l)\n                        });\n                        pln.attr({\n                            transform: \"t\" + [dot.x, dot.y] +\n                                       \"r\" + (dot.alpha - 90)\n                        });\n                        gr.attr({\n                            transform: getShift(dot)\n                        });\n                    }, 10000);\n                };\n            });\n        };\n        </script>\n    </head>\n    <body>\n    </body>\n</html>"
  },
  {
    "path": "demos/clock/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap</title>\n        <style media=\"screen\">\n        body {\n            background: #fff;\n        }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script>\n        window.onload = function () {\n            var s = Snap(600, 600);\n            var path = \"\",\n                nums = s.text(300, 300, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]).attr({\n                    font: \"300 40px Helvetica Neue\",\n                    textAnchor: \"middle\"\n                });\n            for (var i = 0; i < 72; i++) {\n                var r = i % 6 ? i % 3 ? 247 : 240 : 230,\n                    sin = Math.sin(Snap.rad(5 * i)),\n                    cos = Math.cos(Snap.rad(5 * i));\n                path += \"M\" + [300 + 250 * cos, 300 + 250 * sin] + \"L\" + [300 + r * cos, 300 + r * sin];\n                if (!(i % 6)) {\n                    nums.select(\"tspan:nth-child(\" + (i / 6 + 1) + \")\").attr({\n                        x: 300 + 200 * Math.cos(Snap.rad(5 * i - 60)),\n                        y: 300 + 200 * Math.sin(Snap.rad(5 * i - 60)) + 15,\n                    });\n                }\n            }\n            var table = s.g(nums, s.path(path).attr({\n                fill: \"none\",\n                stroke: \"#000\",\n                strokeWidth: 2\n            })).attr({\n                transform: \"t0,210\"\n            });\n            s.g(table).attr({\n                clip: s.circle(300, 300, 100)\n            });\n            var hand = s.line(300, 200, 300, 400).attr({\n                fill: \"none\",\n                stroke: \"#f63\",\n                strokeWidth: 2\n            });\n            s.circle(300, 300, 100).attr({\n                stroke: \"#000\",\n                strokeWidth: 10,\n                fillOpacity: 0\n            }).click(function () {\n                Snap.animate(0, 360, function (val) {\n                    table.transform(\"t\" +\n                    [\n                        210 * Math.cos(Snap.rad(val + 90)), \n                        210 * Math.sin(Snap.rad(val + 90))\n                    ]);\n                    hand.transform(\"r\" + [val, 300, 300]);\n                }, 12000);\n            });\n            \n        };\n        </script>\n    </head>\n    <body>\n    </body>\n</html>"
  },
  {
    "path": "demos/illustrated-infographic-coffee/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Coffee Maker</title>\n        <link rel=\"stylesheet\" href=\"../../dist/fonts/stylesheet.css\">\n        <style media=\"screen\">\n        body {\n            background: #fff;\n            margin: 0;\n            padding: 0;\n        }\n        .shape {\n            fill: none;\n            stroke: #60544F;\n        }\n        .outline,\n        .doors {\n            fill: #F4EEE6;\n            stroke: #60544F;\n            stroke-width: 2pt;\n        }\n        .water {\n            fill: #D6EDEE;\n            stroke: #60544F;\n        }\n        .water-cut {\n            fill: #B4D6DB;\n        }\n        .milk {\n            fill: #fff;\n            stroke: #60544F;\n        }\n        .milk-cut {\n            fill: #F4EEE6;\n        }\n        .coffee {\n            fill: #60544F;\n            stroke: #60544F;\n        }\n        .coffee-cut {\n            fill: #60544F;\n        }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script>\n        window.onload = function () {\n            var s = Snap(1000, 800),\n                p = 100 / 30,\n                h = 250,\n                x = 400,\n                y = 200,\n                R = 100,\n                r = 70,\n                open = 0,\n                gstream,\n                gmilk = \"l()#F4EEE6-#fff:50-#F4EEE6:50-#F4EEE6\",\n                gcoffee = \"l()#60544F-#8c7a73:50-#60544F:50-#60544F\",\n                gwater = \"l()#B4D6DB-#D6EDEE:50-#B4D6DB:50-#B4D6DB\";\n\n            Snap.load(\"demo.svg\", function (f) {\n                var top = f.select(\"#top\"),\n                    bot = f.select(\"#bottom\"),\n                    tap = f.select(\"#tap\"),\n                    knob = f.select(\"#knob\"),\n                    dot = f.select(\"#dot\"),\n                    arr = f.select(\"#arrow\"),\n                    knobcx = knob.attr(\"cx\"),\n                    knobcy = knob.attr(\"cy\"),\n                    lead = f.select(\"#lead\"),\n                    pie = {\n                        cx: f.select(\"#pie-chart circle\").attr(\"cx\"),\n                        cy: f.select(\"#pie-chart circle\").attr(\"cy\"),\n                        r: f.select(\"#pie-chart circle\").attr(\"r\"),\n                        coffee: f.select(\"#legend text\"),\n                        water: f.selectAll(\"#legend text\")[1],\n                        title: f.selectAll(\"#legend text\")[2],\n                        waterBox: f.select(\"#legend rect:nth-child(2)\")\n                    },\n                    angle = 0,\n                    lastAngle,\n                    startAngle,\n                    leadOpenPath = lead.attr(\"d\"),\n                    leadClosedPath = f.select(\"#lead-target\").attr(\"d\"),\n                    closed,\n                    grp = s.g().insertBefore(tap);\n                f.select(\"#pie-chart\").remove();\n                f.select(\"#americano-area\").click(function () {\n                    chosen(0);\n                });\n                f.select(\"#latte-area\").click(function () {\n                    chosen(72);\n                });\n                f.select(\"#mocha-area\").click(function () {\n                    chosen(144);\n                });\n                f.select(\"#mochiatto-area\").click(function () {\n                    chosen(216);\n                });\n                f.select(\"#espresso-area\").click(function () {\n                    chosen(288);\n                });\n                x = +top.attr(\"cx\");\n                y = +top.attr(\"cy\");\n                R = +top.attr(\"rx\");\n                r = +bot.attr(\"rx\");\n                h = bot.attr(\"cy\") - y;\n                s.add(f.select(\"g\"));\n                lead.click(function () {\n                    var path,\n                        ease;\n                    if (closed) {\n                        path = leadOpenPath;\n                        ease = mina.easein;\n                        closed = 0;\n                    } else {\n                        path = leadClosedPath;\n                        ease = mina.bounce;\n                        closed = 1;\n                    }\n                    lead.stop().animate({\n                        d: path\n                    }, 1000, ease);\n                });\n                knob.attr({\n                    fill: \"#000\",\n                    opacity: 0\n                }).drag(function (dx, dy, x, y) {\n                    var a = Snap.angle(knobcx, knobcy, x, y) - startAngle + angle;\n                    dot.transform(\"r\" + [a, knobcx, knobcy]);\n                    arr.transform(\"r\" + [a, knobcx, knobcy]);\n                    lastAngle = a;\n                }, function (x, y) {\n                    startAngle = Snap.angle(knobcx, knobcy, x, y);\n                    lastAngle = angle;\n                    dot.stop();\n                    arr.stop();\n                }, function () {\n                    angle = lastAngle;\n                    var a = Snap.snapTo(72, angle, 36);\n                    chosen(a);\n                });\n                function chosen(a) {\n                    a = (a + 1080) % 360;\n                    angle = a;\n                    var to = \"r\" + [a, knobcx, knobcy];\n                    dot.animate({\n                        transform: to\n                    }, 1000, mina.elastic);\n                    arr.animate({\n                        transform: to\n                    }, 1000, mina.elastic, function () {\n                        closeCup(function () {\n                            types[a]();\n                            pour();\n                            pieShow();\n                        });\n                    });\n                }\n\n                grp.path(outline(0, h)).attr(\"class\", \"outline\");\n                var o3 = (h - 70) / 3,\n                    o2 = (h - 70) / 2,\n                    cover = grp.ellipse(getEll(h - 60)).attr(\"class\", \"water\"),\n                    ct1 = grp.path(cut(10, 10 + o3, 0)).attr({\n                        fill: gcoffee\n                    }),\n                    ct2 = grp.path(cut(10 + o3, h - 60, 0)).attr({\n                        fill: gwater\n                    }),\n                    middle = 10 + o3,\n                    pieCoffee,\n                    pieTitle,\n                    pieType,\n                    g = grp.g(),\n                    dr = grp.path(doors(0)).attr(\"class\", \"doors\"),\n                    types = {\n                        // americano\n                        0: function () {\n                            cover.attr(\"class\", \"water\");\n                            ct2.attr(\"fill\", gwater);\n                            middle = 10 + o3;\n                            pieCoffee = 1 / 3;\n                            pieType = \"water\";\n                            pieTitle = \"Americano\";\n                            gstream = \"l(0,1,0,0)#60544F-#60544F:33-#B4D6DB\";\n                        },\n                        // latté\n                        72: function () {\n                            cover.attr(\"class\", \"milk\");\n                            ct2.attr(\"fill\", gmilk);\n                            middle = 10 + o3 * 2;\n                            pieCoffee = 2 / 3;\n                            pieType = \"milk\";\n                            pieTitle = \"Latté\";\n                            gstream = \"l(0,1,0,0)#60544F-#60544F:66-#fff\";\n                        },\n                        // mocha\n                        144: function () {\n                            cover.attr(\"class\", \"milk\");\n                            ct2.attr(\"fill\", gmilk);\n                            middle = 10 + o3;\n                            pieCoffee = 1 / 3;\n                            pieType = \"milk\";\n                            pieTitle = \"Mocha\";\n                            gstream = \"l(0,1,0,0)#60544F-#60544F:33-#fff\";\n                        },\n                        // machiatto\n                        216: function () {\n                            cover.attr(\"class\", \"milk\");\n                            ct2.attr(\"fill\", gmilk);\n                            middle = 10 + o2;\n                            pieCoffee = 1 / 2;\n                            pieType = \"milk\";\n                            pieTitle = \"Macchiato\";\n                            gstream = \"l(0,1,0,0)#60544F-#60544F:50-#fff\";\n                        },\n                        // espresso\n                        288: function () {\n                            cover.attr(\"class\", \"coffee\");\n                            ct2.attr(\"fill\", gcoffee);\n                            middle = 10;\n                            pieCoffee = 1;\n                            pieType = \"milk\";\n                            pieTitle = \"Espresso\";\n                            gstream = \"#60544F\";\n                        }\n                    };\n                function closeCup(callback) {\n                    Snap.animate(90, 0, function (val) {\n                        ct1.attr(\"path\", cut(10, middle, val));\n                        ct2.attr(\"path\", cut(middle, h - 60, val));\n                        dr.attr(\"path\", doors(val));\n                    }, 500, mina.easein, callback);\n                }\n                function pour() {\n                    steam(g, function () {\n                        Snap.animate(0, 90, function (val) {\n                            ct1.attr(\"path\", cut(10, middle, val));\n                            ct2.attr(\"path\", cut(middle, h - 60, val));\n                            dr.attr(\"path\", doors(val));\n                        }, 1500, mina.elastic);\n                    });\n                }\n                var pieShow = (function () {\n                    var disc = s.circle(pie.cx, pie.cy, pie.r).attr({\n                        fill: \"#fff\",\n                        stroke: \"#60544F\"\n                    }),\n                    coffee = s.path().attr({\n                        stroke: \"#60544F\",\n                        strokeWidth: pie.r,\n                        fill: \"none\"\n                    }),\n                    olda = 0,\n                    a;\n                    return function () {\n                        var cof = pieCoffee,\n                            type = pieType;\n                        a = 360 * cof / 2;\n                        pie.waterBox.attr({\n                            fill: type == \"water\" ? \"#d6edee\" : \"#fff\"\n                        });\n                        disc.attr({\n                            fill: type == \"water\" ? \"#d6edee\" : \"#fff\"\n                        });\n                        pie.title.attr({\n                            \"#text\": pieTitle\n                        });\n                        pie.coffee.attr({\n                            \"#text\": \"Espresso (\" + Math.round(cof * 100) + \"%)\"\n                        });\n                        pie.water.attr({\n                            \"#text\": (type == \"water\" ? \"Hot Water\" : \"Milk\") + \" (\" + (100 - Math.round(cof * 100)) + \"%)\"\n                        });\n                        Snap.animate(olda, a, function (val) {\n                            coffee.attr({\n                                d: \"M\" + [pie.cx, pie.cy] +\n                                   \"U\" + [pie.r / 2, 90 - val, 90 + val]\n                            });\n                        }, 500, function () {\n                            if (cof == 1) {\n                                disc.attr({\n                                    fill: \"#60544F\"\n                                });\n                            }\n                        });\n                        olda = a;\n                    };\n                }());\n                \n                types[0]();\n                pour();\n                pieShow();\n            });\n\n\n            function getEll(height) {\n                var ra = r + (R - r) / h * height;\n                return {\n                    cx: x,\n                    cy: y + h - height,\n                    rx: ra,\n                    ry: ra / p\n                };\n            }\n            function arc(cx, cy, R, r, from, to, command) {\n                var start = pointAtAngle(cx, cy, R, r, from),\n                    end = pointAtAngle(cx, cy, R, r, to);\n                command = command || \"M\";\n                return command + Snap.format(\"{sx},{sy}A{R},{r},0,{big},{way},{tx},{ty}\", {\n                    sx: start.x,\n                    sy: start.y,\n                    R: R,\n                    r: r,\n                    tx: end.x,\n                    ty: end.y,\n                    big: +(Math.abs(to - from) > 180),\n                    way: +(from > to)\n                });\n            }\n            function pointAtAngle(cx, cy, rx, ry, angle) {\n                angle = Snap.rad(angle);\n                return {\n                    x: cx + rx * Math.cos(angle),\n                    y: cy - ry * Math.sin(angle)\n                };\n            }\n            function doors(alpha) {\n                var sa = 270 - alpha / 2,\n                    ea = 270 + alpha / 2;\n                if (alpha) {\n                    return arc(x, y, R, R / p, 180, sa) + arc(x, y + h, r, r / p, sa, 180, \"L\") + \"z\" + \n                           arc(x, y, R, R / p, ea, 360) + arc(x, y + h, r, r / p, 360, ea, \"L\") + \"z\";\n                } else {\n                    return arc(x, y, R, R / p, 180, 360) + arc(x, y + h, r, r / p, 360, 180, \"L\") + \"z\";\n                }\n            }\n            function fill(from, to) {\n                var start = getEll(from),\n                    end = getEll(to);\n                return \"M\" + (start.cx - start.rx) + \",\" + start.cy + \"h\" + start.rx * 2 +\n                       arc(end.cx, end.cy, end.rx, end.ry, 0, 180, \"L\") + \"z\";\n            }\n            function outline(from, to) {\n                var start = getEll(from),\n                    end = getEll(to);\n                return arc(start.cx, start.cy, start.rx, start.ry, 180, 0) +\n                       arc(end.cx, end.cy, end.rx, end.ry, 0, 180, \"L\") + \"z\";\n            }\n            function cut(from, to, alpha) {\n                var s = getEll(from),\n                    e = getEll(to),\n                    sa = Snap.rad(270 - alpha / 2),\n                    ea = Snap.rad(270 + alpha / 2);\n                return \"M\" + [s.cx, s.cy,\n                    s.cx + s.rx * Math.cos(ea), s.cy - s.ry * Math.sin(ea),\n                    e.cx + e.rx * Math.cos(ea), e.cy - e.ry * Math.sin(ea),\n                    e.cx, e.cy,\n                    e.cx + e.rx * Math.cos(sa), e.cy - e.ry * Math.sin(sa),\n                    s.cx + s.rx * Math.cos(sa), s.cy - s.ry * Math.sin(sa)\n                ] + \"z\";\n            }\n            function steam(g, callback) {\n                g.rect(x - 10, y - 1030, 20, 1000, 10).attr({\n                    fill: gstream,\n                    clip: s.rect(x - 10, y - 200, 20, h + 200)\n                }).animate({y: y + 40}, 800, function () {\n                    this.remove();\n                });\n                s.ellipse(x, y, R, R/p).attr({\n                    fill: \"#fff\",\n                    filter: s.filter(Snap.filter.blur(10))\n                }).animate({cy: y - 30, opacity: 0}, 1000, callback);\n            }\n        };\n        </script>\n    </head>\n    <body></body>\n</html>\n"
  },
  {
    "path": "demos/pattern/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap</title>\n        <style media=\"screen\">\n        body {\n            background: #030 url(\"bg.png\");\n        }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script>\n        window.onload = function () {\n            1\n            var s = Snap(\"100%\", 600);\n            \n            // 2\n            // var c = s.circle(100, 100, 50);\n            // \n            // 3\n            // c.attr({\n            //     fill: \"#bada55\",\n            //     stroke: \"#000\",\n            //     \"stroke-width\": 5\n            // });\n            // \n            // 4\n            // var c2 = s.circle(70, 100, 40);\n            // var g = s.group(c2, s.circle(130, 100, 40));\n            // g.attr({\n            //     fill: \"#fff\"\n            // });\n            // \n            // 5\n            // c.attr({\n            //     mask: g\n            // });\n            // \n            // 6\n            // c2.animate({r: 25}, 1000);\n            // \n            // 7\n            // g.select(\"circle:nth-child(2)\").animate({r: 25}, 1000);\n            // \n            // 8\n            // var p = s.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n            //         fill: \"none\",\n            //         stroke: \"#bada55\",\n            //         strokeWidth: 5\n            //     }).pattern(0, 0, 10, 10);\n            // c.attr({\n            //     fill: p\n            // });\n            // \n            // 9\n            // g.attr({\n            //     fill: Snap(document.getElementById(\"pattern\"))\n            // });\n            // \n            // 10\n            // g.attr({fill: \"r()#fff-#000\"});\n            // \n            // 11\n            // g.attr({fill: \"R(100, 100, 50)#fff-#000\"});\n            // \n            // 12\n            // p.select(\"path\").animate({stroke: \"#f00\"}, 1000);\n            // \n            // 13\n            // Snap.load(\"demo-card.svg\", function (f) {\n            //     f.select(\"path[fill='#D40000']\").attr({fill: \"#bada55\"});\n            //     g = s.group(f.selectAll(\"path\"));\n            //     s.append(g);\n            // \n            //     14\n            //     g.attr({\n            //         transform: \"r45t100,0s.5\"\n            //     });\n            //                 \n            //     15\n            //     console.log(g.attr(\"transform\"));\n            //                 \n            //     16\n            //     g.drag();\n            // });\n            // \n            // 17\n            // s.text(200, 100, \"Snap.SVG\");\n            // \n            // 18\n            // var t = s.text(200, 120, [\"S\",\"n\",\"a\",\"p\",\".\",\"S\",\"V\",\"G\"]);\n            // t.selectAll(\"tspan:nth-child(odd)\").attr({\n            //     fill: \"#900\",\n            //     \"font-size\": \"20px\"\n            // });\n        };\n        </script>\n    </head>\n    <body>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n    </body>\n</html>"
  },
  {
    "path": "demos/snap-ad/Gruntfile.js",
    "content": "module.exports = function(grunt) {\n\n    var pkg = grunt.file.readJSON(\"package.json\");\n\n    // Project configuration.\n    grunt.initConfig({\n        copy: {\n            main: {\n                files: [\n                    {\n                        expand: true,\n                        cwd: './src/',\n                        src: [\n                            '*',\n                            '!config.rb',\n                            'js/vendor/require.min.js',\n                            'js/vendor/modernizr.min.js'\n                            ],\n                        dest: './site/',\n                        filter: 'isFile'\n                    },\n                    {\n                        expand: true,\n                        cwd: './src',\n                        src: ['assets/**'],\n                        dest: './site/'\n                    }\n                ]\n            }\n        },\n        requirejs: {\n            compile: {\n                options: {\n                    name: \"main\",\n                    baseUrl: \"./src/js/\",\n                    mainConfigFile: \"./src/js/main.js\",\n                    out: \"./site/js/main.js\"\n                }\n            }\n        },\n        compass: {\n            dist: {\n                options: {\n                    config: './src/config.rb',\n                    sassDir: './src/sass',\n                    cssDir: './site/css'\n                }\n            }\n        },\n        processhtml: {\n            options: {\n                // Task-specific options go here.\n            },\n            dist: {\n                files: {\n                    './site/index.html': ['./site/index.html']\n                }\n            }\n        },\n        inline: {\n            dist: {\n                src: ['./site/index.html'],\n                dest: ['./site/index.min.html']\n            }\n        }\n    });\n\n    grunt.loadNpmTasks('grunt-contrib-copy');\n    grunt.loadNpmTasks('grunt-contrib-requirejs');\n    grunt.loadNpmTasks(\"grunt-contrib-compass\");\n    grunt.loadNpmTasks(\"grunt-processhtml\");\n    grunt.loadNpmTasks(\"grunt-inline\");\n\n    grunt.registerTask(\"default\", [\"copy\", \"requirejs\", \"compass\", \"processhtml\", \"inline\"]);\n};"
  },
  {
    "path": "demos/snap-ad/README.md",
    "content": "snap-ad\n=======\n\nSnap.svg banner ad\n\nrun\n`npm install` \nto add node modules\n\n\nrun\n`grunt`\nto build"
  },
  {
    "path": "demos/snap-ad/SnapAd.tmproj",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>currentDocument</key>\n\t<string>src/js/app/app.js</string>\n\t<key>documents</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>expanded</key>\n\t\t\t<true/>\n\t\t\t<key>name</key>\n\t\t\t<string>src</string>\n\t\t\t<key>regexFolderFilter</key>\n\t\t\t<string>!.*/(\\.[^/]*|CVS|_darcs|_MTN|\\{arch\\}|blib|.*~\\.nib|.*\\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>\n\t\t\t<key>sourceDirectory</key>\n\t\t\t<string>src</string>\n\t\t</dict>\n\t</array>\n\t<key>fileHierarchyDrawerWidth</key>\n\t<integer>185</integer>\n\t<key>metaData</key>\n\t<dict>\n\t\t<key>src/index.html</key>\n\t\t<dict>\n\t\t\t<key>caret</key>\n\t\t\t<dict>\n\t\t\t\t<key>column</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>line</key>\n\t\t\t\t<integer>17</integer>\n\t\t\t</dict>\n\t\t\t<key>columnSelection</key>\n\t\t\t<false/>\n\t\t\t<key>firstVisibleColumn</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>firstVisibleLine</key>\n\t\t\t<integer>3</integer>\n\t\t\t<key>selectFrom</key>\n\t\t\t<dict>\n\t\t\t\t<key>column</key>\n\t\t\t\t<integer>7</integer>\n\t\t\t\t<key>line</key>\n\t\t\t\t<integer>19</integer>\n\t\t\t</dict>\n\t\t\t<key>selectTo</key>\n\t\t\t<dict>\n\t\t\t\t<key>column</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>line</key>\n\t\t\t\t<integer>17</integer>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>src/js/app/app.js</key>\n\t\t<dict>\n\t\t\t<key>caret</key>\n\t\t\t<dict>\n\t\t\t\t<key>column</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>line</key>\n\t\t\t\t<integer>222</integer>\n\t\t\t</dict>\n\t\t\t<key>firstVisibleColumn</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>firstVisibleLine</key>\n\t\t\t<integer>199</integer>\n\t\t</dict>\n\t\t<key>src/js/main.js</key>\n\t\t<dict>\n\t\t\t<key>caret</key>\n\t\t\t<dict>\n\t\t\t\t<key>column</key>\n\t\t\t\t<integer>4</integer>\n\t\t\t\t<key>line</key>\n\t\t\t\t<integer>46</integer>\n\t\t\t</dict>\n\t\t\t<key>firstVisibleColumn</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>firstVisibleLine</key>\n\t\t\t<integer>47</integer>\n\t\t</dict>\n\t\t<key>src/sass/screen.scss</key>\n\t\t<dict>\n\t\t\t<key>caret</key>\n\t\t\t<dict>\n\t\t\t\t<key>column</key>\n\t\t\t\t<integer>2</integer>\n\t\t\t\t<key>line</key>\n\t\t\t\t<integer>81</integer>\n\t\t\t</dict>\n\t\t\t<key>firstVisibleColumn</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>firstVisibleLine</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>openDocuments</key>\n\t<array>\n\t\t<string>src/index.html</string>\n\t\t<string>src/js/main.js</string>\n\t\t<string>src/sass/screen.scss</string>\n\t\t<string>src/js/app/app.js</string>\n\t</array>\n\t<key>showFileHierarchyDrawer</key>\n\t<true/>\n\t<key>windowFrame</key>\n\t<string>{{642, 51}, {651, 811}}</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "demos/snap-ad/package.json",
    "content": "{\n  \"name\": \"snapad\",\n  \"version\": \"0.0.1\",\n  \"description\": \"snap ad\",\n  \"main\": \"Gruntfile.js\",\n  \"repository\": {\n    \"type\": \"git\"\n  },\n  \"author\": \"CJ Gammon\",\n  \"license\": \"Apache License v2\",\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.1\",\n    \"grunt-contrib-copy\": \"*\",\n    \"grunt-contrib-compass\": \"*\",\n    \"grunt-contrib-requirejs\": \"*\",\n    \"grunt-processhtml\": \"*\",\n    \"grunt-inline\": \"*\"\n  }\n}\n"
  },
  {
    "path": "demos/snap-ad/site/css/screen.css",
    "content": "/* line 3, ../../src/sass/screen.scss */\n.base-font {\n  font-family: 'Open Sans', serif;\n}\n\n/* line 7, ../../src/sass/screen.scss */\n.snap-font {\n  font-family: 'Source Sans Pro', serif;\n}\n\n/* line 11, ../../src/sass/screen.scss */\nbody {\n  margin: 0;\n  cursor: pointer;\n}\n\n/* line 16, ../../src/sass/screen.scss */\ntext {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n/* line 25, ../../src/sass/screen.scss */\nsvg {\n  -webkit-transform-origin: top left;\n  -moz-transform-origin: top left;\n  -ms-transform-origin: top left;\n  -o-transform-origin: top left;\n  transform-origin: top left;\n  -webkit-transform: scale(1);\n  -moz-transform: scale(1);\n  -ms-transform: scale(1);\n  -o-transform: scale(1);\n  transform: scale(1);\n}\n\n/* line 30, ../../src/sass/screen.scss */\n#learn-btn {\n  cursor: pointer;\n}\n/* line 33, ../../src/sass/screen.scss */\n#learn-btn path, #learn-btn text {\n  -webkit-transform: translateY(0);\n  -moz-transform: translateY(0);\n  -ms-transform: translateY(0);\n  -o-transform: translateY(0);\n  transform: translateY(0);\n}\n/* line 39, ../../src/sass/screen.scss */\n#learn-btn:hover path:first-child {\n  fill: #076656;\n}\n/* line 46, ../../src/sass/screen.scss */\n#learn-btn:hover path:nth-child(2) {\n  fill: #7cd1c2;\n}\n/* line 51, ../../src/sass/screen.scss */\n#learn-btn:hover text {\n  fill: #0a9a87;\n}\n/* line 59, ../../src/sass/screen.scss */\n#learn-btn:active path:nth-child(2) {\n  -webkit-transform: translateY(2px);\n  -moz-transform: translateY(2px);\n  -ms-transform: translateY(2px);\n  -o-transform: translateY(2px);\n  transform: translateY(2px);\n}\n/* line 64, ../../src/sass/screen.scss */\n#learn-btn:active text {\n  -webkit-transform: translateY(2px);\n  -moz-transform: translateY(2px);\n  -ms-transform: translateY(2px);\n  -o-transform: translateY(2px);\n  transform: translateY(2px);\n}\n\n/* line 71, ../../src/sass/screen.scss */\n#replay-btn:hover {\n  opacity: 0.5;\n}\n\n/*\n@media (max-width: 400px) {\n\tsvg{\n\t\t@include transform(scale(0.375));\n\t}\n}\n*/\n"
  },
  {
    "path": "demos/snap-ad/site/index.html",
    "content": "<!DOCTYPE html>\n<!--[if lt IE 7]>      <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js lt-ie9 lt-ie8\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js lt-ie9\"> <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n\t\t<title>Snap! SVG</title>\n\t\t<link href=\"css/screen.css?__inline=true\" media=\"screen, projection\" rel=\"stylesheet\" type=\"text/css\" />\n\t\t<!--[if IE]>\n\t        <link href=\"/stylesheets/ie.css\" media=\"screen, projection\" rel=\"stylesheet\" type=\"text/css\" />\n\t    <![endif]-->\n\t</head>\n\t<body>\n\t\t<svg id=\"ad\" width=\"400\" height=\"400\">\n\t\t\t<g id=\"meshAContainer\">\n\t\t\t\t<rect x=\"0\" y=\"0\" width=\"400\" height=\"400\" fill=\"#efefef\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"screen1\">\n\t\t\t\t<text id=\"text1\" x=\"200\" y=\"130\" width=\"400\" \n\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfont-size=\"40\" \n\t\t\t\t\tfill=\"#686868\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\tScreens\n\t\t\t\t</text>\n\t\t\t\n\t\t\t\t<text id=\"text2\" x=\"200\" y=\"300\" width=\"400\" \n\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfont-size=\"40\" \n\t\t\t\t\tfill=\"#686868\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\tSVG\n\t\t\t\t</text>\n\t\t\t</g>\n\t\t\t\n\t\t\t<text id=\"text3\"\n\t\t\t\tclass=\"base-font\"\n\t\t\t\tfont-weight=\"100\" \n\t\t\t\tfont-size=\"50\" \n\t\t\t\tfill=\"white\"\n\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\topacity=\"0\">\n\t\t\t\t<tspan x=\"200\" y=\"180\">Make SVG</tspan>\n\t\t\t\t<tspan x=\"200\" y=\"250\">a Snap!</tspan>\n\t\t\t</text>\n\t\t\t\n\t\t\t<g id=\"heart\" transform=\"translate(200, 200)\">\n\t\t\t\t<path id=\"heart-shape\" fill=\"#0DAE8A\" d=\"M14.803-28.95c-5.879,0-11.119,2.418-14.547,6.192c-3.428-3.774-8.668-6.192-14.547-6.192c-10.329,0-23.453,4.75-23.453,23.75s38,35.414,38,35.414s38-16.414,38-35.414S25.133-28.95,14.803-28.95\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"burst\" transform=\"translate(200, 200)\" opacity=\"0\">\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 149.256,-214.94 227.256,-214.94 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 49.256,-214.94 77.256,-214.94 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -78.328,-214.94 -50.744,-212.273 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -113.661,209.06 -86.077,211.727 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,-214.94 -213.41,-135.607 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,-39 -213.41,10.334 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,101 -213.41,130.334 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 215.697,21.383 241.697,50.717 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 215.697,-88.617 241.697,-59.283 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 208.691,137.42 207.805,194.354 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 95.256,211.727 61.923,240.194 \t\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"resolve\" opacity=\"0\">\n\t\t\t\t\n\t\t\t\t<g id=\"replay-btn\" transform=\"translate(345, 10)\">\n\t\t\t\t\t<rect fill=\"transparent\" width=\"48\" height=\"49.5\"/>\n\t\t\t\t\t<path fill=\"#cccccc\" d=\"M25.207,9.594V4.082L12.793,11.25l12.415,7.168v-5.792C31.57,13.466,36.5,18.912,36.5,25.5\n\t\t\t\t\t\tc0,7.168-5.832,13-13,13s-13-5.832-13-13c0-0.565,0.049-1.118,0.119-1.664l-2.922-0.717C7.58,23.898,7.5,24.689,7.5,25.5\n\t\t\t\t\t\tc0,8.822,7.178,16,16,16s16-7.178,16-16C39.5,17.255,33.229,10.449,25.207,9.594z\"/>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<text id=\"text4\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfill=\"#02225d\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\t<tspan x=\"200\" y=\"100\" \n\t\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\t\tfont-size=\"46\">\n\t\t\t\t\t\twith\n\t\t\t\t\t</tspan>\n\t\t\t\t\t<tspan x=\"200\" y=\"160\" \n\t\t\t\t\t\tclass=\"snap-font\"\n\t\t\t\t\t\tfont-size=\"70\">\n\t\t\t\t\t\tSnap.svg\n\t\t\t\t\t</tspan>\n\t\t\t\t</text>\n\t\t\t\t\n\t\t\t\t<g id=\"learn-btn\" transform=\"translate(10, 350)\">\n\t\t\t\t\t<path fill=\"#0B9B87\" d=\"M147.129,37.886c0,3.156-2.558,5.714-5.714,5.714H5.714C2.558,43.6,0,41.042,0,37.886V8.175\n\t\t\t\t\t\tc0-3.156,2.558-5.714,5.714-5.714h135.702c3.156,0,5.714,2.558,5.714,5.714V37.886z\"/>\n\t\t\t\t\t<path fill=\"#10B29C\" d=\"M147.129,35.425c0,3.156-2.558,5.714-5.714,5.714H5.714C2.558,41.139,0,38.581,0,35.425V5.714\n\t\t\t\t\t\tC0,2.558,2.558,0,5.714,0h135.702c3.156,0,5.714,2.558,5.714,5.714V35.425z\"/>\n\t\t\t\t\t<text x=\"10\" y=\"30\"\n\t\t\t\t\t\tfill=\"#FFFFFF\" \n\t\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\t\tfont-size=\"22.6026\">\n\t\t\t\t\t\tLearn More\n\t\t\t\t\t</text>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<g id=\"snap-logo\" transform=\"translate(200, 260)\">\n\t\t\t\t\t<path id=\"snap-logo-bottom\" fill=\"#192350\" d=\"M39.197,39.001c0.061,0.246,0.121,0.492,0.182,0.738c-12.801,6.518-39.257,19.54-39.257,19.54\n\t\t\t\t\t\ts-31.604-14.952-38.953-18.708c6.5-3.264,13.001-6.529,19.502-9.792c6.328,3.094,12.655,6.187,18.985,9.281\n\t\t\t\t\t\tc6.617-3.305,13.03-6.509,19.442-9.712C25.797,33.232,32.497,36.116,39.197,39.001z\"/>\n\t\t\t\t\t<path id=\"snap-logo-right\" fill=\"#03A69A\" d=\"M39.331-54.922c-0.436-0.191-12.519,6.201-18.125,9.588c0,11.23,0,22.46,0,34.096\n\t\t\t\t\t\tC15.45-8.229-33.891,16.743-40.257,20.134c0.058,6.744,0.117,13.489,0.175,20.233c0.417,0.068,0.834,0.136,1.25,0.204\n\t\t\t\t\t\tc6.5-3.264,72.753-37.591,78.221-40.492C39.369-18.255,39.35-36.588,39.331-54.922z\"/>\n\t\t\t\t\t<path id=\"snap-logo-top\" fill=\"#1E2A5A\" d=\"M39.331-54.922c-5.606,3.387-12.519,6.201-18.126,9.588c-7.193-3.185-14.386-6.371-21.719-9.617\n\t\t\t\t\t\tc-7.287,3.21-14.6,6.432-21.914,9.654c-5.869-2.958-11.739-5.916-17.609-8.874c-0.039-0.239-0.078-0.478-0.117-0.717\n\t\t\t\t\t\tc12.766-6.485,25.531-12.969,38.297-19.454C11.437-68.06,26.037-61.204,39.331-54.922z\"/>\n\t\t\t\t\t<path id=\"snap-logo-left\" fill=\"#133F68\" d=\"M-22.676-11.256c0-3.489,0-6.949,0-10.408c0-7.878,0.198-15.755,0.346-23.633\n\t\t\t\t\t\tc-5.869-2.958-11.788-5.916-17.658-8.874c0.003,11.317-0.018,22.635-0.015,33.952c-0.034,6.737-0.081,13.474-0.114,20.21\n\t\t\t\t\t\tc5.781,2.841,52.704,26.952,59.219,30.356c6.7,2.884,13.397,5.769,20.096,8.654c0.029-6.258,0.134-12.516,0.163-18.773\n\t\t\t\t\t\tC33.044,16.882-15.406-7.438-22.676-11.256z\"/>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<g id=\"adobe-logo\" transform=\"translate(350, 340)\">\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"22.447,0 35.605,0 35.605,31.389 \t\"/>\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"13.172,0 0,0 0,31.389 \t\"/>\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"17.809,11.565 26.195,31.387 20.698,31.387 18.189,25.074 12.049,25.074 \t\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#787878\" d=\"M38.294,0c0.843,0,1.515,0.678,1.515,1.524c0,0.859-0.672,1.538-1.521,1.538S36.75,2.383,36.75,1.524\n\t\t\t\t\t\t\tC36.75,0.677,37.438,0,38.288,0H38.294z M38.287,0.259c-0.675,0-1.217,0.567-1.217,1.27c0,0.707,0.542,1.271,1.224,1.271\n\t\t\t\t\t\t\tc0.672,0.007,1.212-0.566,1.212-1.271c0-0.702-0.54-1.27-1.212-1.27H38.287z M38.01,2.414H37.7V0.716\n\t\t\t\t\t\t\tc0.144-0.025,0.285-0.049,0.512-0.049c0.271,0,0.442,0.053,0.556,0.141c0.094,0.068,0.146,0.188,0.146,0.346\n\t\t\t\t\t\t\tc0,0.22-0.142,0.363-0.33,0.411v0.017c0.149,0.026,0.245,0.161,0.277,0.414c0.042,0.265,0.077,0.367,0.105,0.419h-0.311\n\t\t\t\t\t\t\tc-0.039-0.052-0.075-0.207-0.112-0.435c-0.035-0.201-0.146-0.286-0.356-0.286h-0.179v0.721L38.01,2.414L38.01,2.414z M38.01,1.458\n\t\t\t\t\t\t\th0.185c0.221,0,0.406-0.074,0.406-0.271c0-0.15-0.107-0.285-0.392-0.285c-0.093,0-0.152,0-0.197,0.005v0.552L38.01,1.458\n\t\t\t\t\t\t\tL38.01,1.458z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M4.782,44.511L4.366,42.05c-0.123-0.715-0.271-1.823-0.382-2.59H3.941c-0.124,0.771-0.294,1.914-0.42,2.596\n\t\t\t\t\t\tl-0.449,2.456L4.782,44.511L4.782,44.511z M2.847,46.12l-0.541,2.732h-2.01l2.501-11.373h2.457l2.271,11.373H5.507l-0.53-2.732\n\t\t\t\t\t\tH2.847z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M12.086,43.77c0-0.147,0-0.329-0.03-0.492c-0.078-0.561-0.381-1.067-0.863-1.067\n\t\t\t\t\t\tc-0.818,0-1.125,1.188-1.125,2.575c0,1.599,0.437,2.51,1.096,2.51c0.309,0,0.662-0.157,0.854-0.826\n\t\t\t\t\t\tc0.045-0.131,0.069-0.314,0.069-0.523L12.086,43.77L12.086,43.77z M14.148,37.174v9.318c0,0.743,0.037,1.647,0.067,2.359h-1.779\n\t\t\t\t\t\tl-0.119-0.947h-0.041c-0.298,0.583-0.948,1.086-1.721,1.086c-1.702,0-2.547-1.874-2.547-4.238c0-2.877,1.263-4.275,2.629-4.275\n\t\t\t\t\t\tc0.711,0,1.182,0.346,1.415,0.852h0.034v-4.152h2.062C14.148,37.177,14.148,37.174,14.148,37.174z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M18.428,47.415c0.782,0,0.982-1.474,0.982-2.697c0-1.159-0.2-2.67-1.018-2.67\n\t\t\t\t\t\tc-0.869,0-1.054,1.511-1.054,2.67c0,1.402,0.232,2.697,1.071,2.697H18.428z M18.387,48.989c-1.889,0-3.081-1.522-3.081-4.238\n\t\t\t\t\t\tc0-2.963,1.529-4.275,3.127-4.275c1.877,0,3.05,1.592,3.05,4.232c0,3.393-1.838,4.281-3.076,4.281H18.387z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M24.692,45.907c0,0.204,0.035,0.399,0.078,0.525c0.206,0.693,0.561,0.863,0.837,0.863\n\t\t\t\t\t\tc0.795,0,1.12-1.004,1.12-2.612c0-1.462-0.343-2.472-1.129-2.472c-0.392,0-0.72,0.423-0.832,0.877\n\t\t\t\t\t\tc-0.039,0.142-0.074,0.363-0.074,0.521C24.692,43.609,24.692,45.907,24.692,45.907z M22.634,37.174h2.058v4.293h0.032\n\t\t\t\t\t\tc0.406-0.634,0.945-0.994,1.731-0.994c1.55,0,2.331,1.758,2.331,4.049c0,2.91-1.168,4.467-2.67,4.467\n\t\t\t\t\t\tc-0.723,0-1.199-0.32-1.631-1.123h-0.042l-0.112,0.986h-1.765c0.03-0.688,0.069-1.616,0.069-2.359v-9.318L22.634,37.174\n\t\t\t\t\t\tL22.634,37.174z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M33.712,43.945c0.007-1.161-0.328-1.976-0.982-1.976c-0.749,0-1.064,1.094-1.088,1.976H33.712z\n\t\t\t\t\t\t M31.635,45.393c0.024,1.49,0.811,1.978,1.788,1.978c0.623,0,1.153-0.135,1.545-0.287l0.282,1.474\n\t\t\t\t\t\tc-0.548,0.238-1.393,0.383-2.201,0.383c-2.211,0-3.411-1.498-3.411-4.067c0-2.759,1.394-4.408,3.221-4.408\n\t\t\t\t\t\tc1.769,0,2.748,1.458,2.748,3.85c0,0.545-0.026,0.85-0.063,1.093L31.635,45.393z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t\n\t\t\t<rect id=\"cover\" width=\"400\" height=\"400\" fill=\"#efefef\"/>\n\t\t</svg>\n\t\t<script>\n\t\t  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n\t\t  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n\t\t  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n\t\t  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n\t\t  ga('create', 'UA-47561728-1', 'codepen.io');\n\t\t  ga('send', 'pageview');\n\n\t\t</script>\n\t\t\n\t\t<script src=\"js/vendor/require.min.js?__inline=true\"></script>\n\t\t<script src=\"js/main.js?__inline=true\"></script>\n\t\t<script src=\"http://ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js\"></script>\n\n\t\t<script>\n\t\t\tWebFont.load(WebFontConfig);\n\t\t</script>\n\t\t\n\t</body>\n</html>\n"
  },
  {
    "path": "demos/snap-ad/site/index.min.html",
    "content": "<!DOCTYPE html>\n<!--[if lt IE 7]>      <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js lt-ie9 lt-ie8\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js lt-ie9\"> <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n\t\t<title>Snap! SVG</title>\n\t\t<style>\n/* line 3, ../../src/sass/screen.scss */\n.base-font {\n  font-family: 'Open Sans', serif;\n}\n\n/* line 7, ../../src/sass/screen.scss */\n.snap-font {\n  font-family: 'Source Sans Pro', serif;\n}\n\n/* line 11, ../../src/sass/screen.scss */\nbody {\n  margin: 0;\n  cursor: pointer;\n}\n\n/* line 16, ../../src/sass/screen.scss */\ntext {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n/* line 25, ../../src/sass/screen.scss */\nsvg {\n  -webkit-transform-origin: top left;\n  -moz-transform-origin: top left;\n  -ms-transform-origin: top left;\n  -o-transform-origin: top left;\n  transform-origin: top left;\n  -webkit-transform: scale(1);\n  -moz-transform: scale(1);\n  -ms-transform: scale(1);\n  -o-transform: scale(1);\n  transform: scale(1);\n}\n\n/* line 30, ../../src/sass/screen.scss */\n#learn-btn {\n  cursor: pointer;\n}\n/* line 33, ../../src/sass/screen.scss */\n#learn-btn path, #learn-btn text {\n  -webkit-transform: translateY(0);\n  -moz-transform: translateY(0);\n  -ms-transform: translateY(0);\n  -o-transform: translateY(0);\n  transform: translateY(0);\n}\n/* line 39, ../../src/sass/screen.scss */\n#learn-btn:hover path:first-child {\n  fill: #076656;\n}\n/* line 46, ../../src/sass/screen.scss */\n#learn-btn:hover path:nth-child(2) {\n  fill: #7cd1c2;\n}\n/* line 51, ../../src/sass/screen.scss */\n#learn-btn:hover text {\n  fill: #0a9a87;\n}\n/* line 59, ../../src/sass/screen.scss */\n#learn-btn:active path:nth-child(2) {\n  -webkit-transform: translateY(2px);\n  -moz-transform: translateY(2px);\n  -ms-transform: translateY(2px);\n  -o-transform: translateY(2px);\n  transform: translateY(2px);\n}\n/* line 64, ../../src/sass/screen.scss */\n#learn-btn:active text {\n  -webkit-transform: translateY(2px);\n  -moz-transform: translateY(2px);\n  -ms-transform: translateY(2px);\n  -o-transform: translateY(2px);\n  transform: translateY(2px);\n}\n\n/* line 71, ../../src/sass/screen.scss */\n#replay-btn:hover {\n  opacity: 0.5;\n}\n\n/*\n@media (max-width: 400px) {\n\tsvg{\n\t\t@include transform(scale(0.375));\n\t}\n}\n*/\n\n</style>\n\t\t<!--[if IE]>\n\t        <link href=\"/stylesheets/ie.css\" media=\"screen, projection\" rel=\"stylesheet\" type=\"text/css\" />\n\t    <![endif]-->\n\t</head>\n\t<body>\n\t\t<svg id=\"ad\" width=\"400\" height=\"400\">\n\t\t\t<g id=\"meshAContainer\">\n\t\t\t\t<rect x=\"0\" y=\"0\" width=\"400\" height=\"400\" fill=\"#efefef\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"screen1\">\n\t\t\t\t<text id=\"text1\" x=\"200\" y=\"130\" width=\"400\" \n\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfont-size=\"40\" \n\t\t\t\t\tfill=\"#686868\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\tScreens\n\t\t\t\t</text>\n\t\t\t\n\t\t\t\t<text id=\"text2\" x=\"200\" y=\"300\" width=\"400\" \n\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfont-size=\"40\" \n\t\t\t\t\tfill=\"#686868\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\tSVG\n\t\t\t\t</text>\n\t\t\t</g>\n\t\t\t\n\t\t\t<text id=\"text3\"\n\t\t\t\tclass=\"base-font\"\n\t\t\t\tfont-weight=\"100\" \n\t\t\t\tfont-size=\"50\" \n\t\t\t\tfill=\"white\"\n\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\topacity=\"0\">\n\t\t\t\t<tspan x=\"200\" y=\"180\">Make SVG</tspan>\n\t\t\t\t<tspan x=\"200\" y=\"250\">a Snap!</tspan>\n\t\t\t</text>\n\t\t\t\n\t\t\t<g id=\"heart\" transform=\"translate(200, 200)\">\n\t\t\t\t<path id=\"heart-shape\" fill=\"#0DAE8A\" d=\"M14.803-28.95c-5.879,0-11.119,2.418-14.547,6.192c-3.428-3.774-8.668-6.192-14.547-6.192c-10.329,0-23.453,4.75-23.453,23.75s38,35.414,38,35.414s38-16.414,38-35.414S25.133-28.95,14.803-28.95\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"burst\" transform=\"translate(200, 200)\" opacity=\"0\">\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 149.256,-214.94 227.256,-214.94 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 49.256,-214.94 77.256,-214.94 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -78.328,-214.94 -50.744,-212.273 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -113.661,209.06 -86.077,211.727 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,-214.94 -213.41,-135.607 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,-39 -213.41,10.334 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,101 -213.41,130.334 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 215.697,21.383 241.697,50.717 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 215.697,-88.617 241.697,-59.283 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 208.691,137.42 207.805,194.354 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 95.256,211.727 61.923,240.194 \t\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"resolve\" opacity=\"0\">\n\t\t\t\t\n\t\t\t\t<g id=\"replay-btn\" transform=\"translate(345, 10)\">\n\t\t\t\t\t<rect fill=\"transparent\" width=\"48\" height=\"49.5\"/>\n\t\t\t\t\t<path fill=\"#cccccc\" d=\"M25.207,9.594V4.082L12.793,11.25l12.415,7.168v-5.792C31.57,13.466,36.5,18.912,36.5,25.5\n\t\t\t\t\t\tc0,7.168-5.832,13-13,13s-13-5.832-13-13c0-0.565,0.049-1.118,0.119-1.664l-2.922-0.717C7.58,23.898,7.5,24.689,7.5,25.5\n\t\t\t\t\t\tc0,8.822,7.178,16,16,16s16-7.178,16-16C39.5,17.255,33.229,10.449,25.207,9.594z\"/>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<text id=\"text4\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfill=\"#02225d\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\t<tspan x=\"200\" y=\"100\" \n\t\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\t\tfont-size=\"46\">\n\t\t\t\t\t\twith\n\t\t\t\t\t</tspan>\n\t\t\t\t\t<tspan x=\"200\" y=\"160\" \n\t\t\t\t\t\tclass=\"snap-font\"\n\t\t\t\t\t\tfont-size=\"70\">\n\t\t\t\t\t\tSnap.svg\n\t\t\t\t\t</tspan>\n\t\t\t\t</text>\n\t\t\t\t\n\t\t\t\t<g id=\"learn-btn\" transform=\"translate(10, 350)\">\n\t\t\t\t\t<path fill=\"#0B9B87\" d=\"M147.129,37.886c0,3.156-2.558,5.714-5.714,5.714H5.714C2.558,43.6,0,41.042,0,37.886V8.175\n\t\t\t\t\t\tc0-3.156,2.558-5.714,5.714-5.714h135.702c3.156,0,5.714,2.558,5.714,5.714V37.886z\"/>\n\t\t\t\t\t<path fill=\"#10B29C\" d=\"M147.129,35.425c0,3.156-2.558,5.714-5.714,5.714H5.714C2.558,41.139,0,38.581,0,35.425V5.714\n\t\t\t\t\t\tC0,2.558,2.558,0,5.714,0h135.702c3.156,0,5.714,2.558,5.714,5.714V35.425z\"/>\n\t\t\t\t\t<text x=\"10\" y=\"30\"\n\t\t\t\t\t\tfill=\"#FFFFFF\" \n\t\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\t\tfont-size=\"22.6026\">\n\t\t\t\t\t\tLearn More\n\t\t\t\t\t</text>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<g id=\"snap-logo\" transform=\"translate(200, 260)\">\n\t\t\t\t\t<path id=\"snap-logo-bottom\" fill=\"#192350\" d=\"M39.197,39.001c0.061,0.246,0.121,0.492,0.182,0.738c-12.801,6.518-39.257,19.54-39.257,19.54\n\t\t\t\t\t\ts-31.604-14.952-38.953-18.708c6.5-3.264,13.001-6.529,19.502-9.792c6.328,3.094,12.655,6.187,18.985,9.281\n\t\t\t\t\t\tc6.617-3.305,13.03-6.509,19.442-9.712C25.797,33.232,32.497,36.116,39.197,39.001z\"/>\n\t\t\t\t\t<path id=\"snap-logo-right\" fill=\"#03A69A\" d=\"M39.331-54.922c-0.436-0.191-12.519,6.201-18.125,9.588c0,11.23,0,22.46,0,34.096\n\t\t\t\t\t\tC15.45-8.229-33.891,16.743-40.257,20.134c0.058,6.744,0.117,13.489,0.175,20.233c0.417,0.068,0.834,0.136,1.25,0.204\n\t\t\t\t\t\tc6.5-3.264,72.753-37.591,78.221-40.492C39.369-18.255,39.35-36.588,39.331-54.922z\"/>\n\t\t\t\t\t<path id=\"snap-logo-top\" fill=\"#1E2A5A\" d=\"M39.331-54.922c-5.606,3.387-12.519,6.201-18.126,9.588c-7.193-3.185-14.386-6.371-21.719-9.617\n\t\t\t\t\t\tc-7.287,3.21-14.6,6.432-21.914,9.654c-5.869-2.958-11.739-5.916-17.609-8.874c-0.039-0.239-0.078-0.478-0.117-0.717\n\t\t\t\t\t\tc12.766-6.485,25.531-12.969,38.297-19.454C11.437-68.06,26.037-61.204,39.331-54.922z\"/>\n\t\t\t\t\t<path id=\"snap-logo-left\" fill=\"#133F68\" d=\"M-22.676-11.256c0-3.489,0-6.949,0-10.408c0-7.878,0.198-15.755,0.346-23.633\n\t\t\t\t\t\tc-5.869-2.958-11.788-5.916-17.658-8.874c0.003,11.317-0.018,22.635-0.015,33.952c-0.034,6.737-0.081,13.474-0.114,20.21\n\t\t\t\t\t\tc5.781,2.841,52.704,26.952,59.219,30.356c6.7,2.884,13.397,5.769,20.096,8.654c0.029-6.258,0.134-12.516,0.163-18.773\n\t\t\t\t\t\tC33.044,16.882-15.406-7.438-22.676-11.256z\"/>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<g id=\"adobe-logo\" transform=\"translate(350, 340)\">\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"22.447,0 35.605,0 35.605,31.389 \t\"/>\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"13.172,0 0,0 0,31.389 \t\"/>\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"17.809,11.565 26.195,31.387 20.698,31.387 18.189,25.074 12.049,25.074 \t\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#787878\" d=\"M38.294,0c0.843,0,1.515,0.678,1.515,1.524c0,0.859-0.672,1.538-1.521,1.538S36.75,2.383,36.75,1.524\n\t\t\t\t\t\t\tC36.75,0.677,37.438,0,38.288,0H38.294z M38.287,0.259c-0.675,0-1.217,0.567-1.217,1.27c0,0.707,0.542,1.271,1.224,1.271\n\t\t\t\t\t\t\tc0.672,0.007,1.212-0.566,1.212-1.271c0-0.702-0.54-1.27-1.212-1.27H38.287z M38.01,2.414H37.7V0.716\n\t\t\t\t\t\t\tc0.144-0.025,0.285-0.049,0.512-0.049c0.271,0,0.442,0.053,0.556,0.141c0.094,0.068,0.146,0.188,0.146,0.346\n\t\t\t\t\t\t\tc0,0.22-0.142,0.363-0.33,0.411v0.017c0.149,0.026,0.245,0.161,0.277,0.414c0.042,0.265,0.077,0.367,0.105,0.419h-0.311\n\t\t\t\t\t\t\tc-0.039-0.052-0.075-0.207-0.112-0.435c-0.035-0.201-0.146-0.286-0.356-0.286h-0.179v0.721L38.01,2.414L38.01,2.414z M38.01,1.458\n\t\t\t\t\t\t\th0.185c0.221,0,0.406-0.074,0.406-0.271c0-0.15-0.107-0.285-0.392-0.285c-0.093,0-0.152,0-0.197,0.005v0.552L38.01,1.458\n\t\t\t\t\t\t\tL38.01,1.458z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M4.782,44.511L4.366,42.05c-0.123-0.715-0.271-1.823-0.382-2.59H3.941c-0.124,0.771-0.294,1.914-0.42,2.596\n\t\t\t\t\t\tl-0.449,2.456L4.782,44.511L4.782,44.511z M2.847,46.12l-0.541,2.732h-2.01l2.501-11.373h2.457l2.271,11.373H5.507l-0.53-2.732\n\t\t\t\t\t\tH2.847z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M12.086,43.77c0-0.147,0-0.329-0.03-0.492c-0.078-0.561-0.381-1.067-0.863-1.067\n\t\t\t\t\t\tc-0.818,0-1.125,1.188-1.125,2.575c0,1.599,0.437,2.51,1.096,2.51c0.309,0,0.662-0.157,0.854-0.826\n\t\t\t\t\t\tc0.045-0.131,0.069-0.314,0.069-0.523L12.086,43.77L12.086,43.77z M14.148,37.174v9.318c0,0.743,0.037,1.647,0.067,2.359h-1.779\n\t\t\t\t\t\tl-0.119-0.947h-0.041c-0.298,0.583-0.948,1.086-1.721,1.086c-1.702,0-2.547-1.874-2.547-4.238c0-2.877,1.263-4.275,2.629-4.275\n\t\t\t\t\t\tc0.711,0,1.182,0.346,1.415,0.852h0.034v-4.152h2.062C14.148,37.177,14.148,37.174,14.148,37.174z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M18.428,47.415c0.782,0,0.982-1.474,0.982-2.697c0-1.159-0.2-2.67-1.018-2.67\n\t\t\t\t\t\tc-0.869,0-1.054,1.511-1.054,2.67c0,1.402,0.232,2.697,1.071,2.697H18.428z M18.387,48.989c-1.889,0-3.081-1.522-3.081-4.238\n\t\t\t\t\t\tc0-2.963,1.529-4.275,3.127-4.275c1.877,0,3.05,1.592,3.05,4.232c0,3.393-1.838,4.281-3.076,4.281H18.387z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M24.692,45.907c0,0.204,0.035,0.399,0.078,0.525c0.206,0.693,0.561,0.863,0.837,0.863\n\t\t\t\t\t\tc0.795,0,1.12-1.004,1.12-2.612c0-1.462-0.343-2.472-1.129-2.472c-0.392,0-0.72,0.423-0.832,0.877\n\t\t\t\t\t\tc-0.039,0.142-0.074,0.363-0.074,0.521C24.692,43.609,24.692,45.907,24.692,45.907z M22.634,37.174h2.058v4.293h0.032\n\t\t\t\t\t\tc0.406-0.634,0.945-0.994,1.731-0.994c1.55,0,2.331,1.758,2.331,4.049c0,2.91-1.168,4.467-2.67,4.467\n\t\t\t\t\t\tc-0.723,0-1.199-0.32-1.631-1.123h-0.042l-0.112,0.986h-1.765c0.03-0.688,0.069-1.616,0.069-2.359v-9.318L22.634,37.174\n\t\t\t\t\t\tL22.634,37.174z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M33.712,43.945c0.007-1.161-0.328-1.976-0.982-1.976c-0.749,0-1.064,1.094-1.088,1.976H33.712z\n\t\t\t\t\t\t M31.635,45.393c0.024,1.49,0.811,1.978,1.788,1.978c0.623,0,1.153-0.135,1.545-0.287l0.282,1.474\n\t\t\t\t\t\tc-0.548,0.238-1.393,0.383-2.201,0.383c-2.211,0-3.411-1.498-3.411-4.067c0-2.759,1.394-4.408,3.221-4.408\n\t\t\t\t\t\tc1.769,0,2.748,1.458,2.748,3.85c0,0.545-0.026,0.85-0.063,1.093L31.635,45.393z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t\n\t\t\t<rect id=\"cover\" width=\"400\" height=\"400\" fill=\"#efefef\"/>\n\t\t</svg>\n\t\t<script>\n\t\t  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n\t\t  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n\t\t  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n\t\t  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n\t\t  ga('create', 'UA-47561728-1', 'codepen.io');\n\t\t  ga('send', 'pageview');\n\n\t\t</script>\n\t\t\n\t\t<script>\n/*\n RequireJS 2.1.10 Copyright (c) 2010-2014, 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(ca){function G(b){return\"[object Function]\"===N.call(b)}function H(b){return\"[object Array]\"===N.call(b)}function v(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function U(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function s(b,c){return ga.call(b,c)}function j(b,c){return s(b,c)&&b[c]}function B(b,c){for(var d in b)if(s(b,d)&&c(b[d],d))break}function V(b,c,d,g){c&&B(c,function(c,h){if(d||!s(b,h))g&&\"object\"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof\nRegExp)?(b[h]||(b[h]={}),V(b[h],c,d,g)):b[h]=c});return b}function t(b,c){return function(){return c.apply(b,arguments)}}function da(b){throw b;}function ea(b){if(!b)return b;var c=ca;v(b.split(\".\"),function(b){c=c[b]});return c}function C(b,c,d,g){c=Error(c+\"\\nhttp://requirejs.org/docs/errors.html#\"+b);c.requireType=b;c.requireModules=g;d&&(c.originalError=d);return c}function ha(b){function c(a,e,b){var f,n,c,d,g,h,i,I=e&&e.split(\"/\");n=I;var m=l.map,k=m&&m[\"*\"];if(a&&\".\"===a.charAt(0))if(e){n=\nI.slice(0,I.length-1);a=a.split(\"/\");e=a.length-1;l.nodeIdCompat&&R.test(a[e])&&(a[e]=a[e].replace(R,\"\"));n=a=n.concat(a);d=n.length;for(e=0;e<d;e++)if(c=n[e],\".\"===c)n.splice(e,1),e-=1;else if(\"..\"===c)if(1===e&&(\"..\"===n[2]||\"..\"===n[0]))break;else 0<e&&(n.splice(e-1,2),e-=2);a=a.join(\"/\")}else 0===a.indexOf(\"./\")&&(a=a.substring(2));if(b&&m&&(I||k)){n=a.split(\"/\");e=n.length;a:for(;0<e;e-=1){d=n.slice(0,e).join(\"/\");if(I)for(c=I.length;0<c;c-=1)if(b=j(m,I.slice(0,c).join(\"/\")))if(b=j(b,d)){f=b;\ng=e;break a}!h&&(k&&j(k,d))&&(h=j(k,d),i=e)}!f&&h&&(f=h,g=i);f&&(n.splice(0,g,f),a=n.join(\"/\"))}return(f=j(l.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName(\"script\"),function(e){if(e.getAttribute(\"data-requiremodule\")===a&&e.getAttribute(\"data-requirecontext\")===i.contextName)return e.parentNode.removeChild(e),!0})}function g(a){var e=j(l.paths,a);if(e&&H(e)&&1<e.length)return e.shift(),i.require.undef(a),i.require([a]),!0}function u(a){var e,b=a?a.indexOf(\"!\"):-1;-1<b&&(e=a.substring(0,\nb),a=a.substring(b+1,a.length));return[e,a]}function m(a,e,b,f){var n,d,g=null,h=e?e.name:null,l=a,m=!0,k=\"\";a||(m=!1,a=\"_@r\"+(N+=1));a=u(a);g=a[0];a=a[1];g&&(g=c(g,h,f),d=j(p,g));a&&(g?k=d&&d.normalize?d.normalize(a,function(a){return c(a,h,f)}):c(a,h,f):(k=c(a,h,f),a=u(k),g=a[0],k=a[1],b=!0,n=i.nameToUrl(k)));b=g&&!d&&!b?\"_unnormalized\"+(Q+=1):\"\";return{prefix:g,name:k,parentMap:e,unnormalized:!!b,url:n,originalName:l,isDefine:m,id:(g?g+\"!\"+k:k)+b}}function q(a){var e=a.id,b=j(k,e);b||(b=k[e]=new i.Module(a));\nreturn b}function r(a,e,b){var f=a.id,n=j(k,f);if(s(p,f)&&(!n||n.defineEmitComplete))\"defined\"===e&&b(p[f]);else if(n=q(a),n.error&&\"error\"===e)b(n.error);else n.on(e,b)}function w(a,e){var b=a.requireModules,f=!1;if(e)e(a);else if(v(b,function(e){if(e=j(k,e))e.error=a,e.events.error&&(f=!0,e.emit(\"error\",a))}),!f)h.onError(a)}function x(){S.length&&(ia.apply(A,[A.length,0].concat(S)),S=[])}function y(a){delete k[a];delete W[a]}function F(a,e,b){var f=a.map.id;a.error?a.emit(\"error\",a.error):(e[f]=\n!0,v(a.depMaps,function(f,c){var d=f.id,g=j(k,d);g&&(!a.depMatched[c]&&!b[d])&&(j(e,d)?(a.defineDep(c,p[d]),a.check()):F(g,e,b))}),b[f]=!0)}function D(){var a,e,b=(a=1E3*l.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],c=[],h=!1,k=!0;if(!X){X=!0;B(W,function(a){var i=a.map,m=i.id;if(a.enabled&&(i.isDefine||c.push(a),!a.error))if(!a.inited&&b)g(m)?h=e=!0:(f.push(m),d(m));else if(!a.inited&&(a.fetched&&i.isDefine)&&(h=!0,!i.prefix))return k=!1});if(b&&f.length)return a=C(\"timeout\",\"Load timeout for modules: \"+\nf,null,f),a.contextName=i.contextName,w(a);k&&v(c,function(a){F(a,{},{})});if((!b||e)&&h)if((z||fa)&&!Y)Y=setTimeout(function(){Y=0;D()},50);X=!1}}function E(a){s(p,a[0])||q(m(a[0],null,!0)).init(a[1],a[2])}function L(a){var a=a.currentTarget||a.srcElement,e=i.onScriptLoad;a.detachEvent&&!Z?a.detachEvent(\"onreadystatechange\",e):a.removeEventListener(\"load\",e,!1);e=i.onScriptError;(!a.detachEvent||Z)&&a.removeEventListener(\"error\",e,!1);return{node:a,id:a&&a.getAttribute(\"data-requiremodule\")}}function M(){var a;\nfor(x();A.length;){a=A.shift();if(null===a[0])return w(C(\"mismatch\",\"Mismatched anonymous define() module: \"+a[a.length-1]));E(a)}}var X,$,i,K,Y,l={waitSeconds:7,baseUrl:\"./\",paths:{},bundles:{},pkgs:{},shim:{},config:{}},k={},W={},aa={},A=[],p={},T={},ba={},N=1,Q=1;K={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=p[a.map.id]={}},module:function(a){return a.module?a.module:\na.module={id:a.map.id,uri:a.map.url,config:function(){return j(l.config,a.map.id)||{}},exports:K.exports(a)}}};$=function(a){this.events=j(aa,a.id)||{};this.map=a;this.shim=j(l.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};$.prototype={init:function(a,e,b,f){f=f||{};if(!this.inited){this.factory=e;if(b)this.on(\"error\",b);else this.events.error&&(b=t(this,function(a){this.emit(\"error\",a)}));this.depMaps=a&&a.slice(0);this.errback=b;this.inited=\n!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,e){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=e)},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||[],t(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=\nthis.map.url;T[a]||(T[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,e,b=this.map.id;e=this.depExports;var f=this.exports,c=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(G(c)){if(this.events.error&&this.map.isDefine||h.onError!==da)try{f=i.execCb(b,c,e,f)}catch(d){a=d}else f=i.execCb(b,c,e,f);this.map.isDefine&&void 0===f&&((e=this.module)?f=e.exports:this.usingExports&&\n(f=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\",w(this.error=a)}else f=c;this.exports=f;if(this.map.isDefine&&!this.ignore&&(p[b]=f,h.onResourceLoad))h.onResourceLoad(i,this.map,this.depMaps);y(b);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit(\"defined\",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=\nthis.map,b=a.id,d=m(a.prefix);this.depMaps.push(d);r(d,\"defined\",t(this,function(f){var d,g;g=j(ba,this.map.id);var J=this.map.name,u=this.map.parentMap?this.map.parentMap.name:null,p=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(J=f.normalize(J,function(a){return c(a,u,!0)})||\"\"),f=m(a.prefix+\"!\"+J,this.map.parentMap),r(f,\"defined\",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),g=j(k,f.id)){this.depMaps.push(f);\nif(this.events.error)g.on(\"error\",t(this,function(a){this.emit(\"error\",a)}));g.enable()}}else g?(this.map.url=i.nameToUrl(g),this.load()):(d=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),d.error=t(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(k,function(a){0===a.map.id.indexOf(b+\"_unnormalized\")&&y(a.map.id)});w(a)}),d.fromText=t(this,function(f,c){var g=a.name,J=m(g),k=O;c&&(f=c);k&&(O=!1);q(J);s(l.config,b)&&(l.config[g]=l.config[b]);try{h.exec(f)}catch(j){return w(C(\"fromtexteval\",\n\"fromText eval for \"+b+\" failed: \"+j,j,[b]))}k&&(O=!0);this.depMaps.push(J);i.completeLoad(g);p([g],d)}),f.load(a.name,p,d,l))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){W[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,t(this,function(a,b){var c,f;if(\"string\"===typeof a){a=m(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=j(K,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;r(a,\"defined\",t(this,function(a){this.defineDep(b,\na);this.check()}));this.errback&&r(a,\"error\",t(this,this.errback))}c=a.id;f=k[c];!s(K,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,t(this,function(a){var b=j(k,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){v(this.events[a],function(a){a(b)});\"error\"===a&&delete this.events[a]}};i={config:l,contextName:b,registry:k,defined:p,urlFetched:T,defQueue:A,Module:$,makeModuleMap:m,\nnextTick:h.nextTick,onError:w,configure:function(a){a.baseUrl&&\"/\"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+=\"/\");var b=l.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(l[b]||(l[b]={}),V(l[b],a,!0,!0)):l[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(ba[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),l.shim=b);a.packages&&v(a.packages,function(a){var b,\na=\"string\"===typeof a?{name:a}:a;b=a.name;a.location&&(l.paths[b]=a.location);l.pkgs[b]=a.name+\"/\"+(a.main||\"main\").replace(ja,\"\").replace(R,\"\")});B(k,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=m(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(ca,arguments));return b||a.exports&&ea(a.exports)}},makeRequire:function(a,e){function g(f,c,d){var j,l;e.enableBuildCallback&&(c&&G(c))&&(c.__requireJsBuild=\n!0);if(\"string\"===typeof f){if(G(c))return w(C(\"requireargs\",\"Invalid require call\"),d);if(a&&s(K,f))return K[f](k[a.id]);if(h.get)return h.get(i,f,a,g);j=m(f,a,!1,!0);j=j.id;return!s(p,j)?w(C(\"notloaded\",'Module name \"'+j+'\" has not been loaded yet for context: '+b+(a?\"\":\". Use require([])\"))):p[j]}M();i.nextTick(function(){M();l=q(m(null,a));l.skipMap=e.skipMap;l.init(f,c,d,{enabled:!0});D()});return g}e=e||{};V(g,{isBrowser:z,toUrl:function(b){var e,d=b.lastIndexOf(\".\"),g=b.split(\"/\")[0];if(-1!==\nd&&(!(\".\"===g||\"..\"===g)||1<d))e=b.substring(d,b.length),b=b.substring(0,d);return i.nameToUrl(c(b,a&&a.id,!0),e,!0)},defined:function(b){return s(p,m(b,a,!1,!0).id)},specified:function(b){b=m(b,a,!1,!0).id;return s(p,b)||s(k,b)}});a||(g.undef=function(b){x();var c=m(b,a,!0),e=j(k,b);d(b);delete p[b];delete T[c.url];delete aa[b];U(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&(aa[b]=e.events),y(b))});return g},enable:function(a){j(k,a.id)&&q(a).enable()},completeLoad:function(a){var b,\nc,f=j(l.shim,a)||{},d=f.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=j(k,a);if(!b&&!s(p,a)&&c&&!c.inited){if(l.enforceDefine&&(!d||!ea(d)))return g(a)?void 0:w(C(\"nodefine\",\"No define call for \"+a,null,[a]));E([a,f.deps||[],f.exportsFn])}D()},nameToUrl:function(a,b,c){var f,d,g;(f=j(l.pkgs,a))&&(a=f);if(f=j(ba,a))return i.nameToUrl(f,b,c);if(h.jsExtRegExp.test(a))f=a+(b||\"\");else{f=l.paths;a=a.split(\"/\");for(d=a.length;0<d;d-=1)if(g=a.slice(0,\nd).join(\"/\"),g=j(f,g)){H(g)&&(g=g[0]);a.splice(0,d,g);break}f=a.join(\"/\");f+=b||(/^data\\:|\\?/.test(f)||c?\"\":\".js\");f=(\"/\"===f.charAt(0)||f.match(/^[\\w\\+\\.\\-]+:/)?\"\":l.baseUrl)+f}return l.urlArgs?f+((-1===f.indexOf(\"?\")?\"?\":\"&\")+l.urlArgs):f},load:function(a,b){h.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=L(a),i.completeLoad(a.id)},onScriptError:function(a){var b=L(a);if(!g(b.id))return w(C(\"scripterror\",\n\"Script error for: \"+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var h,x,y,D,L,E,P,M,q,Q,la=/(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,ma=/[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,R=/\\.js$/,ja=/^\\.\\//;x=Object.prototype;var N=x.toString,ga=x.hasOwnProperty,ia=Array.prototype.splice,z=!!(\"undefined\"!==typeof window&&\"undefined\"!==typeof navigator&&window.document),fa=!z&&\"undefined\"!==typeof importScripts,ka=z&&\"PLAYSTATION 3\"===navigator.platform?/^complete$/:/^(complete|loaded)$/,\nZ=\"undefined\"!==typeof opera&&\"[object Opera]\"===opera.toString(),F={},r={},S=[],O=!1;if(\"undefined\"===typeof define){if(\"undefined\"!==typeof requirejs){if(G(requirejs))return;r=requirejs;requirejs=void 0}\"undefined\"!==typeof require&&!G(require)&&(r=require,require=void 0);h=requirejs=function(b,c,d,g){var u,m=\"_\";!H(b)&&\"string\"!==typeof b&&(u=b,H(c)?(b=c,c=d,d=g):b=[]);u&&u.context&&(m=u.context);(g=j(F,m))||(g=F[m]=h.s.newContext(m));u&&g.configure(u);return g.require(b,c,d)};h.config=function(b){return h(b)};\nh.nextTick=\"undefined\"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=h);h.version=\"2.1.10\";h.jsExtRegExp=/^\\/|:|\\?|\\.js$/;h.isBrowser=z;x=h.s={contexts:F,newContext:ha};h({});v([\"toUrl\",\"undef\",\"defined\",\"specified\"],function(b){h[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName(\"head\")[0],D=document.getElementsByTagName(\"base\")[0]))y=x.head=D.parentNode;h.onError=da;h.createNode=function(b){var c=\nb.xhtml?document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"html:script\"):document.createElement(\"script\");c.type=b.scriptType||\"text/javascript\";c.charset=\"utf-8\";c.async=!0;return c};h.load=function(b,c,d){var g=b&&b.config||{};if(z)return g=h.createNode(g,c,d),g.setAttribute(\"data-requirecontext\",b.contextName),g.setAttribute(\"data-requiremodule\",c),g.attachEvent&&!(g.attachEvent.toString&&0>g.attachEvent.toString().indexOf(\"[native code\"))&&!Z?(O=!0,g.attachEvent(\"onreadystatechange\",b.onScriptLoad)):\n(g.addEventListener(\"load\",b.onScriptLoad,!1),g.addEventListener(\"error\",b.onScriptError,!1)),g.src=d,M=g,D?y.insertBefore(g,D):y.appendChild(g),M=null,g;if(fa)try{importScripts(d),b.completeLoad(c)}catch(j){b.onError(C(\"importscripts\",\"importScripts failed for \"+c+\" at \"+d,j,[c]))}};z&&!r.skipDataMain&&U(document.getElementsByTagName(\"script\"),function(b){y||(y=b.parentNode);if(L=b.getAttribute(\"data-main\"))return q=L,r.baseUrl||(E=q.split(\"/\"),q=E.pop(),Q=E.length?E.join(\"/\")+\"/\":\"./\",r.baseUrl=\nQ),q=q.replace(R,\"\"),h.jsExtRegExp.test(q)&&(q=L),r.deps=r.deps?r.deps.concat(q):[q],!0});define=function(b,c,d){var g,h;\"string\"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(la,\"\").replace(ma,function(b,d){c.push(d)}),c=(1===d.length?[\"require\"]:[\"require\",\"exports\",\"module\"]).concat(c)));if(O){if(!(g=M))P&&\"interactive\"===P.readyState||U(document.getElementsByTagName(\"script\"),function(b){if(\"interactive\"===b.readyState)return P=b}),g=P;g&&(b||\n(b=g.getAttribute(\"data-requiremodule\")),h=F[g.getAttribute(\"data-requirecontext\")])}(h?h.defQueue:S).push([b,c,d])};define.amd={jQuery:!0};h.exec=function(b){return eval(b)};h(r)}})(this);\n\n</script>\n\t\t<script>\n\n// Snap.svg 0.2.0\n// \n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// \n// build: 2013-12-23\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.4.2 - JavaScript Events Library                      │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n    var version = \"0.4.2\",\n        has = \"hasOwnProperty\",\n        separator = /[\\.\\/]/,\n        wildcard = \"*\",\n        fun = function () {},\n        numsort = function (a, b) {\n            return a - b;\n        },\n        current_event,\n        stop,\n        events = {n: {}},\n    /*\\\n     * eve\n     [ method ]\n\n     * Fires event with given `name`, given scope and other parameters.\n\n     > Arguments\n\n     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n     - scope (object) context for the event handlers\n     - varargs (...) the rest of arguments will be sent to event handlers\n\n     = (object) array of returned values from the listeners\n    \\*/\n        eve = function (name, scope) {\n\t\t\tname = String(name);\n            var e = events,\n                oldstop = stop,\n                args = Array.prototype.slice.call(arguments, 2),\n                listeners = eve.listeners(name),\n                z = 0,\n                f = false,\n                l,\n                indexed = [],\n                queue = {},\n                out = [],\n                ce = current_event,\n                errors = [];\n            current_event = name;\n            stop = 0;\n            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n                indexed.push(listeners[i].zIndex);\n                if (listeners[i].zIndex < 0) {\n                    queue[listeners[i].zIndex] = listeners[i];\n                }\n            }\n            indexed.sort(numsort);\n            while (indexed[z] < 0) {\n                l = queue[indexed[z++]];\n                out.push(l.apply(scope, args));\n                if (stop) {\n                    stop = oldstop;\n                    return out;\n                }\n            }\n            for (i = 0; i < ii; i++) {\n                l = listeners[i];\n                if (\"zIndex\" in l) {\n                    if (l.zIndex == indexed[z]) {\n                        out.push(l.apply(scope, args));\n                        if (stop) {\n                            break;\n                        }\n                        do {\n                            z++;\n                            l = queue[indexed[z]];\n                            l && out.push(l.apply(scope, args));\n                            if (stop) {\n                                break;\n                            }\n                        } while (l)\n                    } else {\n                        queue[l.zIndex] = l;\n                    }\n                } else {\n                    out.push(l.apply(scope, args));\n                    if (stop) {\n                        break;\n                    }\n                }\n            }\n            stop = oldstop;\n            current_event = ce;\n            return out.length ? out : null;\n        };\n\t\t// Undocumented. Debug only.\n\t\teve._events = events;\n    /*\\\n     * eve.listeners\n     [ method ]\n\n     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n     > Arguments\n\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n     = (array) array of event handlers\n    \\*/\n    eve.listeners = function (name) {\n        var names = name.split(separator),\n            e = events,\n            item,\n            items,\n            k,\n            i,\n            ii,\n            j,\n            jj,\n            nes,\n            es = [e],\n            out = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            nes = [];\n            for (j = 0, jj = es.length; j < jj; j++) {\n                e = es[j].n;\n                items = [e[names[i]], e[wildcard]];\n                k = 2;\n                while (k--) {\n                    item = items[k];\n                    if (item) {\n                        nes.push(item);\n                        out = out.concat(item.f || []);\n                    }\n                }\n            }\n            es = nes;\n        }\n        return out;\n    };\n    \n    /*\\\n     * eve.on\n     [ method ]\n     **\n     * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n     | eve.on(\"*.under.*\", f);\n     | eve(\"mouse.under.floor\"); // triggers f\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n     > Example:\n     | eve.on(\"mouse\", eatIt)(2);\n     | eve.on(\"mouse\", scream);\n     | eve.on(\"mouse\", catchIt)(1);\n     * This will ensure that `catchIt()` function will be called before `eatIt()`.\n\t *\n     * If you want to put your handler before non-indexed handlers, specify a negative value.\n     * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n    \\*/\n    eve.on = function (name, f) {\n\t\tname = String(name);\n\t\tif (typeof f != \"function\") {\n\t\t\treturn function () {};\n\t\t}\n        var names = name.split(separator),\n            e = events;\n        for (var i = 0, ii = names.length; i < ii; i++) {\n            e = e.n;\n            e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n        }\n        e.f = e.f || [];\n        for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n            return fun;\n        }\n        e.f.push(f);\n        return function (zIndex) {\n            if (+zIndex == +zIndex) {\n                f.zIndex = +zIndex;\n            }\n        };\n    };\n    /*\\\n     * eve.f\n     [ method ]\n     **\n     * Returns function that will fire given event with optional arguments.\n\t * Arguments that will be passed to the result function will be also\n\t * concated to the list of final arguments.\n \t | el.onclick = eve.f(\"click\", 1, 2);\n \t | eve.on(\"click\", function (a, b, c) {\n \t |     console.log(a, b, c); // 1, 2, [event object]\n \t | });\n     > Arguments\n\t - event (string) event name\n\t - varargs (…) and any other arguments\n\t = (function) possible event handler function\n    \\*/\n\teve.f = function (event) {\n\t\tvar attrs = [].slice.call(arguments, 1);\n\t\treturn function () {\n\t\t\teve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n\t\t};\n\t};\n    /*\\\n     * eve.stop\n     [ method ]\n     **\n     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n    \\*/\n    eve.stop = function () {\n        stop = 1;\n    };\n    /*\\\n     * eve.nt\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     > Arguments\n     **\n     - subname (string) #optional subname of the event\n     **\n     = (string) name of the event, if `subname` is not specified\n     * or\n     = (boolean) `true`, if current event’s name contains `subname`\n    \\*/\n    eve.nt = function (subname) {\n        if (subname) {\n            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(current_event);\n        }\n        return current_event;\n    };\n    /*\\\n     * eve.nts\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     **\n     = (array) names of the event\n    \\*/\n    eve.nts = function () {\n        return current_event.split(separator);\n    };\n    /*\\\n     * eve.off\n     [ method ]\n     **\n     * Removes given function from the list of event listeners assigned to given name.\n\t * If no arguments specified all the events will be cleared.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n    \\*/\n    /*\\\n     * eve.unbind\n     [ method ]\n     **\n     * See @eve.off\n    \\*/\n    eve.off = eve.unbind = function (name, f) {\n\t\tif (!name) {\n\t\t    eve._events = events = {n: {}};\n\t\t\treturn;\n\t\t}\n        var names = name.split(separator),\n            e,\n            key,\n            splice,\n            i, ii, j, jj,\n            cur = [events];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            for (j = 0; j < cur.length; j += splice.length - 2) {\n                splice = [j, 1];\n                e = cur[j].n;\n                if (names[i] != wildcard) {\n                    if (e[names[i]]) {\n                        splice.push(e[names[i]]);\n                    }\n                } else {\n                    for (key in e) if (e[has](key)) {\n                        splice.push(e[key]);\n                    }\n                }\n                cur.splice.apply(cur, splice);\n            }\n        }\n        for (i = 0, ii = cur.length; i < ii; i++) {\n            e = cur[i];\n            while (e.n) {\n                if (f) {\n                    if (e.f) {\n                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n                            e.f.splice(j, 1);\n                            break;\n                        }\n                        !e.f.length && delete e.f;\n                    }\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        var funcs = e.n[key].f;\n                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n                            funcs.splice(j, 1);\n                            break;\n                        }\n                        !funcs.length && delete e.n[key].f;\n                    }\n                } else {\n                    delete e.f;\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        delete e.n[key].f;\n                    }\n                }\n                e = e.n;\n            }\n        }\n    };\n    /*\\\n     * eve.once\n     [ method ]\n     **\n     * Binds given event handler with a given name to only run once then unbind itself.\n     | eve.once(\"login\", f);\n     | eve(\"login\"); // triggers f\n     | eve(\"login\"); // no listeners\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) same return function as @eve.on\n    \\*/\n    eve.once = function (name, f) {\n        var f2 = function () {\n            eve.unbind(name, f2);\n            return f.apply(this, arguments);\n        };\n        return eve.on(name, f2);\n    };\n    /*\\\n     * eve.version\n     [ property (string) ]\n     **\n     * Current version of the library.\n    \\*/\n    eve.version = version;\n    eve.toString = function () {\n        return \"You are running Eve \" + version;\n    };\n    (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : (typeof define != \"undefined\" ? (define(\"eve\", [], function() { return eve; })) : (glob.eve = eve));\n})(this);\n\n(function (glob, factory) {\n    // AMD support\n    if (typeof define === \"function\" && define.amd) {\n        // Define as an anonymous module\n        define('snap',[\"eve\"], function( eve ) {\n            return factory(glob, eve);\n        });\n    } else {\n        // Browser globals (glob is window)\n        // Snap adds itself to window\n        factory(glob, glob.eve);\n    }\n}(this, function (window, eve) {\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n    var animations = {},\n    requestAnimFrame = window.requestAnimationFrame       ||\n                       window.webkitRequestAnimationFrame ||\n                       window.mozRequestAnimationFrame    ||\n                       window.oRequestAnimationFrame      ||\n                       window.msRequestAnimationFrame     ||\n                       function (callback) {\n                           setTimeout(callback, 16);\n                       },\n    isArray = Array.isArray || function (a) {\n        return a instanceof Array ||\n            Object.prototype.toString.call(a) == \"[object Array]\";\n    },\n    idgen = 0,\n    idprefix = \"M\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    diff = function (a, b, A, B) {\n        if (isArray(a)) {\n            res = [];\n            for (var i = 0, ii = a.length; i < ii; i++) {\n                res[i] = diff(a[i], b, A[i], B);\n            }\n            return res;\n        }\n        var dif = (A - a) / (B - b);\n        return function (bb) {\n            return a + dif * (bb - b);\n        };\n    },\n    timer = Date.now || function () {\n        return +new Date;\n    },\n    sta = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.s;\n        }\n        var ds = a.s - val;\n        a.b += a.dur * ds;\n        a.B += a.dur * ds;\n        a.s = val;\n    },\n    speed = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.spd;\n        }\n        a.spd = val;\n    },\n    duration = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.dur;\n        }\n        a.s = a.s * val / a.dur;\n        a.dur = val;\n    },\n    stopit = function () {\n        var a = this;\n        delete animations[a.id];\n        eve(\"mina.stop.\" + a.id, a);\n    },\n    pause = function () {\n        var a = this;\n        if (a.pdif) {\n            return;\n        }\n        delete animations[a.id];\n        a.pdif = a.get() - a.b;\n    },\n    resume = function () {\n        var a = this;\n        if (!a.pdif) {\n            return;\n        }\n        a.b = a.get() - a.pdif;\n        delete a.pdif;\n        animations[a.id] = a;\n    },\n    frame = function () {\n        var len = 0;\n        for (var i in animations) if (animations.hasOwnProperty(i)) {\n            var a = animations[i],\n                b = a.get(),\n                res;\n            len++;\n            a.s = (b - a.b) / (a.dur / a.spd);\n            if (a.s >= 1) {\n                delete animations[i];\n                a.s = 1;\n                len--;\n                (function (a) {\n                    setTimeout(function () {\n                        eve(\"mina.finish.\" + a.id, a);\n                    });\n                }(a));\n            }\n            if (isArray(a.start)) {\n                res = [];\n                for (var j = 0, jj = a.start.length; j < jj; j++) {\n                    res[j] = +a.start[j] +\n                        (a.end[j] - a.start[j]) * a.easing(a.s);\n                }\n            } else {\n                res = +a.start + (a.end - a.start) * a.easing(a.s);\n            }\n            a.set(res);\n        }\n        len && requestAnimFrame(frame);\n    },\n    // SIERRA Unfamiliar with the word _slave_ in this context. Also, I don't know what _gereal_ means. Do you mean _general_?\n    /*\\\n     * mina\n     [ method ]\n     **\n     * Generic animation of numbers\n     **\n     - a (number) start _slave_ number\n     - A (number) end _slave_ number\n     - b (number) start _master_ number (start time in general case)\n     - B (number) end _master_ number (end time in gereal case)\n     - get (function) getter of _master_ number (see @mina.time)\n     - set (function) setter of _slave_ number\n     - easing (function) #optional easing function, default is @mina.linear\n     = (object) animation descriptor\n     o {\n     o         id (string) animation id,\n     o         start (number) start _slave_ number,\n     o         end (number) end _slave_ number,\n     o         b (number) start _master_ number,\n     o         s (number) animation status (0..1),\n     o         dur (number) animation duration,\n     o         spd (number) animation speed,\n     o         get (function) getter of _master_ number (see @mina.time),\n     o         set (function) setter of _slave_ number,\n     o         easing (function) easing function, default is @mina.linear,\n     o         status (function) status getter/setter,\n     o         speed (function) speed getter/setter,\n     o         duration (function) duration getter/setter,\n     o         stop (function) animation stopper\n     o }\n    \\*/\n    mina = function (a, A, b, B, get, set, easing) {\n        var anim = {\n            id: ID(),\n            start: a,\n            end: A,\n            b: b,\n            s: 0,\n            dur: B - b,\n            spd: 1,\n            get: get,\n            set: set,\n            easing: easing || mina.linear,\n            status: sta,\n            speed: speed,\n            duration: duration,\n            stop: stopit,\n            pause: pause,\n            resume: resume\n        };\n        animations[anim.id] = anim;\n        var len = 0, i;\n        for (i in animations) if (animations.hasOwnProperty(i)) {\n            len++;\n            if (len == 2) {\n                break;\n            }\n        }\n        len == 1 && requestAnimFrame(frame);\n        return anim;\n    };\n    /*\\\n     * mina.time\n     [ method ]\n     **\n     * Returns the current time. Equivalent to:\n     | function () {\n     |     return (new Date).getTime();\n     | }\n    \\*/\n    mina.time = timer;\n    /*\\\n     * mina.getById\n     [ method ]\n     **\n     * Returns an animation by its id\n     - id (string) animation's id\n     = (object) See @mina\n    \\*/\n    mina.getById = function (id) {\n        return animations[id] || null;\n    };\n\n    /*\\\n     * mina.linear\n     [ method ]\n     **\n     * Default linear easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.linear = function (n) {\n        return n;\n    };\n    /*\\\n     * mina.easeout\n     [ method ]\n     **\n     * Easeout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeout = function (n) {\n        return Math.pow(n, 1.7);\n    };\n    /*\\\n     * mina.easein\n     [ method ]\n     **\n     * Easein easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easein = function (n) {\n        return Math.pow(n, .48);\n    };\n    /*\\\n     * mina.easeinout\n     [ method ]\n     **\n     * Easeinout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeinout = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        if (n == 0) {\n            return 0;\n        }\n        var q = .48 - n / 1.04,\n            Q = Math.sqrt(.1734 + q * q),\n            x = Q - q,\n            X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n            y = -Q - q,\n            Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n            t = X + Y + .5;\n        return (1 - t) * 3 * t * t + t * t * t;\n    };\n    /*\\\n     * mina.backin\n     [ method ]\n     **\n     * Backin easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backin = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        var s = 1.70158;\n        return n * n * ((s + 1) * n - s);\n    };\n    /*\\\n     * mina.backout\n     [ method ]\n     **\n     * Backout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backout = function (n) {\n        if (n == 0) {\n            return 0;\n        }\n        n = n - 1;\n        var s = 1.70158;\n        return n * n * ((s + 1) * n + s) + 1;\n    };\n    /*\\\n     * mina.elastic\n     [ method ]\n     **\n     * Elastic easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.elastic = function (n) {\n        if (n == !!n) {\n            return n;\n        }\n        return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n            (2 * Math.PI) / .3) + 1;\n    };\n    /*\\\n     * mina.bounce\n     [ method ]\n     **\n     * Bounce easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.bounce = function (n) {\n        var s = 7.5625,\n            p = 2.75,\n            l;\n        if (n < (1 / p)) {\n            l = s * n * n;\n        } else {\n            if (n < (2 / p)) {\n                n -= (1.5 / p);\n                l = s * n * n + .75;\n            } else {\n                if (n < (2.5 / p)) {\n                    n -= (2.25 / p);\n                    l = s * n * n + .9375;\n                } else {\n                    n -= (2.625 / p);\n                    l = s * n * n + .984375;\n                }\n            }\n        }\n        return l;\n    };\n    window.mina = mina;\n    return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function() {\nSnap.version = \"0.2.0\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n    if (w) {\n        if (w.tagName) {\n            return wrap(w);\n        }\n        if (w instanceof Element) {\n            return w;\n        }\n        if (h == null) {\n            w = glob.doc.querySelector(w);\n            return wrap(w);\n        }\n    }\n    w = w == null ? \"100%\" : w;\n    h = h == null ? \"100%\" : h;\n    return new Paper(w, h);\n}\nSnap.toString = function () {\n    return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n    win: window,\n    doc: window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n    Str = String,\n    toFloat = parseFloat,\n    toInt = parseInt,\n    math = Math,\n    mmax = math.max,\n    mmin = math.min,\n    abs = math.abs,\n    pow = math.pow,\n    PI = math.PI,\n    round = math.round,\n    E = \"\",\n    S = \" \",\n    objectToString = Object.prototype.toString,\n    ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n    colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n    bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n    reURLValue = /^url\\(#?([^)]+)\\)$/,\n    spaces = \"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\",\n    separator = new RegExp(\"[,\" + spaces + \"]+\"),\n    whitespace = new RegExp(\"[\" + spaces + \"]\", \"g\"),\n    commaSpaces = new RegExp(\"[\" + spaces + \"]*,[\" + spaces + \"]*\"),\n    hsrg = {hs: 1, rg: 1},\n    pathCommand = new RegExp(\"([a-z])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    tCommand = new RegExp(\"([rstm])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    pathValues = new RegExp(\"(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\" + spaces + \"]*,?[\" + spaces + \"]*\", \"ig\"),\n    idgen = 0,\n    idprefix = \"S\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    xlink = \"http://www.w3.org/1999/xlink\",\n    xmlns = \"http://www.w3.org/2000/svg\",\n    hub = {},\n    URL = Snap.url = function (url) {\n        return \"url('#\" + url + \"')\";\n    };\n\nfunction $(el, attr) {\n    if (attr) {\n        if (typeof el == \"string\") {\n            el = $(el);\n        }\n        if (typeof attr == \"string\") {\n            if (attr.substring(0, 6) == \"xlink:\") {\n                return el.getAttributeNS(xlink, attr.substring(6));\n            }\n            if (attr.substring(0, 4) == \"xml:\") {\n                return el.getAttributeNS(xmlns, attr.substring(4));\n            }\n            return el.getAttribute(attr);\n        }\n        for (var key in attr) if (attr[has](key)) {\n            var val = Str(attr[key]);\n            if (val) {\n                if (key.substring(0, 6) == \"xlink:\") {\n                    el.setAttributeNS(xlink, key.substring(6), val);\n                } else if (key.substring(0, 4) == \"xml:\") {\n                    el.setAttributeNS(xmlns, key.substring(4), val);\n                } else {\n                    el.setAttribute(key, val);\n                }\n            } else {\n                el.removeAttribute(key);\n            }\n        }\n    } else {\n        el = glob.doc.createElementNS(xmlns, el);\n        // el.style && (el.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\");\n    }\n    return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n    var attrs = el.attributes,\n        name,\n        out = {};\n    for (var i = 0; i < attrs.length; i++) {\n        if (attrs[i].namespaceURI == xlink) {\n            name = \"xlink:\";\n        } else {\n            name = \"\";\n        }\n        name += attrs[i].name;\n        out[name] = attrs[i].textContent;\n    }\n    return out;\n}\nfunction is(o, type) {\n    type = Str.prototype.toLowerCase.call(type);\n    if (type == \"finite\") {\n        return isFinite(o);\n    }\n    if (type == \"array\" &&\n        (o instanceof Array || Array.isArray && Array.isArray(o))) {\n        return true;\n    }\n    return  (type == \"null\" && o === null) ||\n            (type == typeof o && o !== null) ||\n            (type == \"object\" && o === Object(o)) ||\n            objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{<name>}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n |     x: 10,\n |     y: 20,\n |     dim: {\n |         width: 40,\n |         height: 50,\n |         \"negative width\": -40\n |     }\n | }));\n\\*/\nSnap.format = (function () {\n    var tokenRegex = /\\{([^\\}]+)\\}/g,\n        objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n        replacer = function (all, key, obj) {\n            var res = obj;\n            key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                name = name || quotedName;\n                if (res) {\n                    if (name in res) {\n                        res = res[name];\n                    }\n                    typeof res == \"function\" && isFunc && (res = res());\n                }\n            });\n            res = (res == null || res == obj ? all : res) + \"\";\n            return res;\n        };\n    return function (str, obj) {\n        return Str(str).replace(tokenRegex, function (all, key) {\n            return replacer(all, key, obj);\n        });\n    };\n})();\nvar preload = (function () {\n    function onerror() {\n        this.parentNode.removeChild(this);\n    }\n    return function (src, f) {\n        var img = glob.doc.createElement(\"img\"),\n            body = glob.doc.body;\n        img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n        img.onload = function () {\n            f.call(img);\n            img.onload = img.onerror = null;\n            body.removeChild(img);\n        };\n        img.onerror = onerror;\n        body.appendChild(img);\n        img.src = src;\n    };\n}());\nfunction clone(obj) {\n    if (typeof obj == \"function\" || Object(obj) !== obj) {\n        return obj;\n    }\n    var res = new obj.constructor;\n    for (var key in obj) if (obj[has](key)) {\n        res[key] = clone(obj[key]);\n    }\n    return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n        return array.push(array.splice(i, 1)[0]);\n    }\n}\nfunction cacher(f, scope, postprocessor) {\n    function newf() {\n        var arg = Array.prototype.slice.call(arguments, 0),\n            args = arg.join(\"\\u2400\"),\n            cache = newf.cache = newf.cache || {},\n            count = newf.count = newf.count || [];\n        if (cache[has](args)) {\n            repush(count, args);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        count.length >= 1e3 && delete cache[count.shift()];\n        count.push(args);\n        cache[args] = f.apply(scope, arg);\n        return postprocessor ? postprocessor(cache[args]) : cache[args];\n    }\n    return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n    if (x3 == null) {\n        var x = x1 - x2,\n            y = y1 - y2;\n        if (!x && !y) {\n            return 0;\n        }\n        return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n    } else {\n        return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n    }\n}\nfunction rad(deg) {\n    return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n    return rad * 180 / PI % 360;\n}\nfunction x_y() {\n    return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n    return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n// SIERRA for which point is the angle calculated?\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n > Parameters\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n    tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n    if (is(values, \"array\")) {\n        var i = values.length;\n        while (i--) if (abs(values[i] - value) <= tolerance) {\n            return values[i];\n        }\n    } else {\n        values = +values;\n        var rem = value % values;\n        if (rem < tolerance) {\n            return value - rem;\n        }\n        if (rem > values - tolerance) {\n            return value - rem + values;\n        }\n    }\n    return value;\n};\n\n// MATRIX\nfunction Matrix(a, b, c, d, e, f) {\n    if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n        this.a = a.a;\n        this.b = a.b;\n        this.c = a.c;\n        this.d = a.d;\n        this.e = a.e;\n        this.f = a.f;\n        return;\n    }\n    if (a != null) {\n        this.a = +a;\n        this.b = +b;\n        this.c = +c;\n        this.d = +d;\n        this.e = +e;\n        this.f = +f;\n    } else {\n        this.a = 1;\n        this.b = 0;\n        this.c = 0;\n        this.d = 1;\n        this.e = 0;\n        this.f = 0;\n    }\n}\n(function (matrixproto) {\n    /*\\\n     * Matrix.add\n     [ method ]\n     **\n     * Adds the given matrix to existing one\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     * or\n     - matrix (object) @Matrix\n    \\*/\n    matrixproto.add = function (a, b, c, d, e, f) {\n        var out = [[], [], []],\n            m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\n            matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\n            x, y, z, res;\n\n        if (a && a instanceof Matrix) {\n            matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\n        }\n\n        for (x = 0; x < 3; x++) {\n            for (y = 0; y < 3; y++) {\n                res = 0;\n                for (z = 0; z < 3; z++) {\n                    res += m[x][z] * matrix[z][y];\n                }\n                out[x][y] = res;\n            }\n        }\n        this.a = out[0][0];\n        this.b = out[1][0];\n        this.c = out[0][1];\n        this.d = out[1][1];\n        this.e = out[0][2];\n        this.f = out[1][2];\n        return this;\n    };\n    /*\\\n     * Matrix.invert\n     [ method ]\n     **\n     * Returns an inverted version of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.invert = function () {\n        var me = this,\n            x = me.a * me.d - me.b * me.c;\n        return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n    };\n    /*\\\n     * Matrix.clone\n     [ method ]\n     **\n     * Returns a copy of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.clone = function () {\n        return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n    };\n    /*\\\n     * Matrix.translate\n     [ method ]\n     **\n     * Translate the matrix\n     - x (number) horizontal offset distance\n     - y (number) vertical offset distance\n    \\*/\n    matrixproto.translate = function (x, y) {\n        return this.add(1, 0, 0, 1, x, y);\n    };\n    /*\\\n     * Matrix.scale\n     [ method ]\n     **\n     * Scales the matrix\n     - x (number) amount to be scaled, with `1` resulting in no change\n     - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n     - cx (number) #optional horizontal origin point from which to scale\n     - cy (number) #optional vertical origin point from which to scale\n     * Default cx, cy is the middle point of the element.\n    \\*/\n    matrixproto.scale = function (x, y, cx, cy) {\n        y == null && (y = x);\n        (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\n        this.add(x, 0, 0, y, 0, 0);\n        (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\n        return this;\n    };\n    /*\\\n     * Matrix.rotate\n     [ method ]\n     **\n     * Rotates the matrix\n     - a (number) angle of rotation, in degrees\n     - x (number) horizontal origin point from which to rotate\n     - y (number) vertical origin point from which to rotate\n    \\*/\n    matrixproto.rotate = function (a, x, y) {\n        a = rad(a);\n        x = x || 0;\n        y = y || 0;\n        var cos = +math.cos(a).toFixed(9),\n            sin = +math.sin(a).toFixed(9);\n        this.add(cos, sin, -sin, cos, x, y);\n        return this.add(1, 0, 0, 1, -x, -y);\n    };\n    /*\\\n     * Matrix.x\n     [ method ]\n     **\n     * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n     - x (number)\n     - y (number)\n     = (number) x\n    \\*/\n    matrixproto.x = function (x, y) {\n        return x * this.a + y * this.c + this.e;\n    };\n    /*\\\n     * Matrix.y\n     [ method ]\n     **\n     * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n     - x (number)\n     - y (number)\n     = (number) y\n    \\*/\n    matrixproto.y = function (x, y) {\n        return x * this.b + y * this.d + this.f;\n    };\n    matrixproto.get = function (i) {\n        return +this[Str.fromCharCode(97 + i)].toFixed(4);\n    };\n    matrixproto.toString = function () {\n        return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n    };\n    matrixproto.offset = function () {\n        return [this.e.toFixed(4), this.f.toFixed(4)];\n    };\n    function norm(a) {\n        return a[0] * a[0] + a[1] * a[1];\n    }\n    function normalize(a) {\n        var mag = math.sqrt(norm(a));\n        a[0] && (a[0] /= mag);\n        a[1] && (a[1] /= mag);\n    }\n    /*\\\n     * Matrix.split\n     [ method ]\n     **\n     * Splits matrix into primitive transformations\n     = (object) in format:\n     o dx (number) translation by x\n     o dy (number) translation by y\n     o scalex (number) scale by x\n     o scaley (number) scale by y\n     o shear (number) shear\n     o rotate (number) rotation in deg\n     o isSimple (boolean) could it be represented via simple transformations\n    \\*/\n    matrixproto.split = function () {\n        var out = {};\n        // translation\n        out.dx = this.e;\n        out.dy = this.f;\n\n        // scale and shear\n        var row = [[this.a, this.c], [this.b, this.d]];\n        out.scalex = math.sqrt(norm(row[0]));\n        normalize(row[0]);\n\n        out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n        row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n        out.scaley = math.sqrt(norm(row[1]));\n        normalize(row[1]);\n        out.shear /= out.scaley;\n\n        // rotation\n        var sin = -row[0][1],\n            cos = row[1][1];\n        if (cos < 0) {\n            out.rotate = deg(math.acos(cos));\n            if (sin < 0) {\n                out.rotate = 360 - out.rotate;\n            }\n        } else {\n            out.rotate = deg(math.asin(sin));\n        }\n\n        out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n        out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n        out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n        return out;\n    };\n    /*\\\n     * Matrix.toTransformString\n     [ method ]\n     **\n     * Returns transform string that represents given matrix\n     = (string) transform string\n    \\*/\n    matrixproto.toTransformString = function (shorter) {\n        var s = shorter || this.split();\n        if (s.isSimple) {\n            s.scalex = +s.scalex.toFixed(4);\n            s.scaley = +s.scaley.toFixed(4);\n            s.rotate = +s.rotate.toFixed(4);\n            return  (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) + \n                    (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E) +\n                    (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E);\n        } else {\n            return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n        }\n    };\n})(Matrix.prototype);\n/*\\\n * Snap.Matrix\n [ method ]\n **\n * Utility method\n **\n * Returns a matrix based on the given parameters\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - svgMatrix (SVGMatrix)\n = (object) @Matrix\n\\*/\nSnap.Matrix = Matrix;\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n # <ul>\n #     <li>Color name (<code>red</code>, <code>green</code>, <code>cornflowerblue</code>, etc)</li>\n #     <li>#••• — shortened HTML color: (<code>#000</code>, <code>#fc0</code>, etc.)</li>\n #     <li>#•••••• — full length HTML color: (<code>#000000</code>, <code>#bd2300</code>)</li>\n #     <li>rgb(•••, •••, •••) — red, green and blue channels values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n #     <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n #     <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n #     <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsl(•••, •••, •••) — hue, saturation and luminosity values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n #     <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n # </ul>\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n    if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    if (colour == \"none\") {\n        return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n    }\n    !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n    if (!colour) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    var res,\n        red,\n        green,\n        blue,\n        opacity,\n        t,\n        values,\n        rgb = colour.match(colourRegExp);\n    if (rgb) {\n        if (rgb[2]) {\n            blue = toInt(rgb[2].substring(5), 16);\n            green = toInt(rgb[2].substring(3, 5), 16);\n            red = toInt(rgb[2].substring(1, 3), 16);\n        }\n        if (rgb[3]) {\n            blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n            green = toInt((t = rgb[3].charAt(2)) + t, 16);\n            red = toInt((t = rgb[3].charAt(1)) + t, 16);\n        }\n        if (rgb[4]) {\n            values = rgb[4].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red *= 2.55);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green *= 2.55);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue *= 2.55);\n            rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n        }\n        if (rgb[5]) {\n            values = rgb[5].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsb2rgb(red, green, blue, opacity);\n        }\n        if (rgb[6]) {\n            values = rgb[6].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsl2rgb(red, green, blue, opacity);\n        }\n        red = mmin(math.round(red), 255);\n        green = mmin(math.round(green), 255);\n        blue = mmin(math.round(blue), 255);\n        opacity = mmin(mmax(opacity, 0), 1);\n        rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n        rgb.hex = \"#\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\n        rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n        return rgb;\n    }\n    return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n// SIERRA It seems odd that the following 3 conversion methods are not expressed as .this2that(), like the others.\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n    return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n    return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n    if (is(o, \"finite\")) {\n        var round = math.round;\n        return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n    }\n    return \"#\" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);\n});\nvar toHex = function (color) {\n    var i = glob.doc.getElementsByTagName(\"head\")[0],\n        red = \"rgb(255, 0, 0)\";\n    toHex = cacher(function (color) {\n        if (color.toLowerCase() == \"red\") {\n            return red;\n        }\n        i.style.color = red;\n        i.style.color = color;\n        var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n        return out == red ? null : out;\n    });\n    return toHex(color);\n},\nhsbtoString = function () {\n    return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n    return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n    return this.opacity == 1 || this.opacity == null ?\n            this.hex :\n            \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n    if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n        b = r.b;\n        g = r.g;\n        r = r.r;\n    }\n    if (g == null && is(r, string)) {\n        var clr = Snap.getRGB(r);\n        r = clr.r;\n        g = clr.g;\n        b = clr.b;\n    }\n    if (r > 1 || g > 1 || b > 1) {\n        r /= 255;\n        g /= 255;\n        b /= 255;\n    }\n    \n    return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n    r = math.round(r * 255);\n    g = math.round(g * 255);\n    b = math.round(b * 255);\n    var rgb = {\n        r: r,\n        g: g,\n        b: b,\n        opacity: is(o, \"finite\") ? o : 1,\n        hex: Snap.rgb(r, g, b),\n        toString: rgbtoString\n    };\n    is(o, \"finite\") && (rgb.opacity = o);\n    return rgb;\n};\n// SIERRA Clarify if Snap does not support consolidated HSLA/RGBA colors. E.g., can you specify a semi-transparent value for Snap.filter.shadow()?\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) `true` if string can't be parsed,\n o     h (number) hue,\n o     s (number) saturation,\n o     v (number) value (brightness),\n o     l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n    var rgb;\n    if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n        rgb = Snap.hsb2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n        rgb = Snap.hsl2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else {\n        if (is(clr, \"string\")) {\n            clr = Snap.getRGB(clr);\n        }\n        if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n            rgb = Snap.rgb2hsl(clr);\n            clr.h = rgb.h;\n            clr.s = rgb.s;\n            clr.l = rgb.l;\n            rgb = Snap.rgb2hsb(clr);\n            clr.v = rgb.b;\n        } else {\n            clr = {hex: \"none\"};\n            clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            clr.error = 1;\n        }\n    }\n    clr.toString = rgbtoString;\n    return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n        v = h.b;\n        s = h.s;\n        h = h.h;\n        o = h.o;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = v * s;\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = v - C;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n        l = h.l;\n        s = h.s;\n        h = h.h;\n    }\n    if (h > 1 || s > 1 || l > 1) {\n        h /= 360;\n        s /= 100;\n        l /= 100;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = 2 * s * (l < .5 ? l : 1 - l);\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = l - C / 2;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, V, C;\n    V = mmax(r, g, b);\n    C = V - mmin(r, g, b);\n    H = (C == 0 ? null :\n         V == r ? (g - b) / C :\n         V == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4\n        );\n    H = ((H + 360) % 6) * 60 / 360;\n    S = C == 0 ? 0 : C / V;\n    return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, L, M, m, C;\n    M = mmax(r, g, b);\n    m = mmin(r, g, b);\n    C = M - m;\n    H = (C == 0 ? null :\n         M == r ? (g - b) / C :\n         M == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4);\n    H = ((H + 360) % 6) * 60 / 360;\n    L = (M + m) / 2;\n    S = (C == 0 ? 0 :\n         L < .5 ? C / (2 * L) :\n                  C / (2 - 2 * L));\n    return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n// SIERRA Snap.parsePathString(): By _array of arrays,_ I assume you mean a format like this for two separate segments? [ [\"M10,10\",\"L90,90\"], [\"M90,10\",\"L10,90\"] ] Otherwise how is each command structured?\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n    if (!pathString) {\n        return null;\n    }\n    var pth = Snap.path(pathString);\n    if (pth.arr) {\n        return Snap.path.clone(pth.arr);\n    }\n    \n    var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n        data = [];\n    if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(pathString);\n    }\n    if (!data.length) {\n        Str(pathString).replace(pathCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            if (name == \"m\" && params.length > 2) {\n                data.push([b].concat(params.splice(0, 2)));\n                name = \"l\";\n                b = b == \"m\" ? \"l\" : \"L\";\n            }\n            if (name == \"o\" && params.length == 1) {\n                data.push([b, params[0]]);\n            }\n            if (name == \"r\") {\n                data.push([b].concat(params));\n            } else while (params.length >= paramCounts[name]) {\n                data.push([b].concat(params.splice(0, paramCounts[name])));\n                if (!paramCounts[name]) {\n                    break;\n                }\n            }\n        });\n    }\n    data.toString = Snap.path.toString;\n    pth.arr = Snap.path.clone(data);\n    return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n    if (!TString) {\n        return null;\n    }\n    var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n        data = [];\n    if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(TString);\n    }\n    if (!data.length) {\n        Str(TString).replace(tCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            data.push([b].concat(params));\n        });\n    }\n    data.toString = Snap.path.toString;\n    return data;\n};\nfunction svgTransform2string(tstr) {\n    var res = [];\n    tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n        params = params.split(/\\s*,\\s*|\\s+/);\n        if (name == \"rotate\" && params.length == 1) {\n            params.push(0, 0);\n        }\n        if (name == \"scale\") {\n            if (params.length == 2) {\n                params.push(0, 0);\n            }\n            if (params.length == 1) {\n                params.push(params[0], 0, 0);\n            }\n        }\n        if (name == \"skewX\") {\n            res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n        } else if (name == \"skewY\") {\n            res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n        } else {\n            res.push([name.charAt(0)].concat(params));\n        }\n        return all;\n    });\n    return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = new RegExp(\"^[a-z][\" + spaces + \"]*-?\\\\.?\\\\d\", \"i\");\nfunction transform2matrix(tstr, bbox) {\n    var tdata = parseTransformString(tstr),\n        m = new Matrix;\n    if (tdata) {\n        for (var i = 0, ii = tdata.length; i < ii; i++) {\n            var t = tdata[i],\n                tlen = t.length,\n                command = Str(t[0]).toLowerCase(),\n                absolute = t[0] != command,\n                inver = absolute ? m.invert() : 0,\n                x1,\n                y1,\n                x2,\n                y2,\n                bb;\n            if (command == \"t\" && tlen == 2){\n                m.translate(t[1], 0);\n            } else if (command == \"t\" && tlen == 3) {\n                if (absolute) {\n                    x1 = inver.x(0, 0);\n                    y1 = inver.y(0, 0);\n                    x2 = inver.x(t[1], t[2]);\n                    y2 = inver.y(t[1], t[2]);\n                    m.translate(x2 - x1, y2 - y1);\n                } else {\n                    m.translate(t[1], t[2]);\n                }\n            } else if (command == \"r\") {\n                if (tlen == 2) {\n                    bb = bb || bbox;\n                    m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.rotate(t[1], x2, y2);\n                    } else {\n                        m.rotate(t[1], t[2], t[3]);\n                    }\n                }\n            } else if (command == \"s\") {\n                if (tlen == 2 || tlen == 3) {\n                    bb = bb || bbox;\n                    m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.scale(t[1], t[1], x2, y2);\n                    } else {\n                        m.scale(t[1], t[1], t[2], t[3]);\n                    }\n                } else if (tlen == 5) {\n                    if (absolute) {\n                        x2 = inver.x(t[3], t[4]);\n                        y2 = inver.y(t[3], t[4]);\n                        m.scale(t[1], t[2], x2, y2);\n                    } else {\n                        m.scale(t[1], t[2], t[3], t[4]);\n                    }\n                }\n            } else if (command == \"m\" && tlen == 7) {\n                m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n            }\n        }\n    }\n    return m;\n}\nSnap._.transform2matrix = transform2matrix;\nfunction extractTransform(el, tstr) {\n    if (tstr == null) {\n        var doReturn = true;\n        if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n            tstr = el.node.getAttribute(\"gradientTransform\");\n        } else if (el.type == \"pattern\") {\n            tstr = el.node.getAttribute(\"patternTransform\");\n        } else {\n            tstr = el.node.getAttribute(\"transform\");\n        }\n        if (!tstr) {\n            return new Matrix;\n        }\n        tstr = svgTransform2string(tstr);\n    } else {\n        if (!Snap._.rgTransform.test(tstr)) {\n            tstr = svgTransform2string(tstr);\n        } else {\n            tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || E);\n        }\n        if (is(tstr, \"array\")) {\n            tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n        }\n        el._.transform = tstr;\n    }\n    var m = transform2matrix(tstr, el.getBBox(1));\n    if (doReturn) {\n        return m;\n    } else {\n        el.matrix = m;\n    }\n}\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n    function (a, b) {\n        var adown = a.nodeType == 9 ? a.documentElement : a,\n            bup = b && b.parentNode;\n            return a == bup || !!(bup && bup.nodeType == 1 && (\n                adown.contains ?\n                    adown.contains(bup) :\n                    a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n            ));\n    } :\n    function (a, b) {\n        if (b) {\n            while (b) {\n                b = b.parentNode;\n                if (b == a) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\nfunction getSomeDefs(el) {\n    var cache = Snap._.someDefs;\n    if (cache && contains(cache.ownerDocument.documentElement, cache)) {\n        return cache;\n    }\n    var p = (el.node.ownerSVGElement && wrap(el.node.ownerSVGElement)) ||\n            (el.node.parentNode && wrap(el.node.parentNode)) ||\n            Snap.select(\"svg\") ||\n            Snap(0, 0),\n        pdefs = p.select(\"defs\"),\n        defs  = pdefs == null ? false : pdefs.node;\n    if (!defs) {\n        defs = make(\"defs\", p.node).node;\n    }\n    Snap._.someDefs = defs;\n    return defs;\n}\nSnap._.getSomeDefs = getSomeDefs;\nfunction unit2px(el, name, value) {\n    var defs = getSomeDefs(el),\n        out = {},\n        mgr = defs.querySelector(\".svg---mgr\");\n    if (!mgr) {\n        mgr = $(\"rect\");\n        $(mgr, {width: 10, height: 10, \"class\": \"svg---mgr\"});\n        defs.appendChild(mgr);\n    }\n    function getW(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {width: val});\n        return mgr.getBBox().width;\n    }\n    function getH(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {height: val});\n        return mgr.getBBox().height;\n    }\n    function set(nam, f) {\n        if (name == null) {\n            out[nam] = f(el.attr(nam));\n        } else if (nam == name) {\n            out = f(value == null ? el.attr(nam) : value);\n        }\n    }\n    switch (el.type) {\n        case \"rect\":\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        case \"image\":\n            set(\"width\", getW);\n            set(\"height\", getH);\n        case \"text\":\n            set(\"x\", getW);\n            set(\"y\", getH);\n        break;\n        case \"circle\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"r\", getW);\n        break;\n        case \"ellipse\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        break;\n        case \"line\":\n            set(\"x1\", getW);\n            set(\"x2\", getW);\n            set(\"y1\", getH);\n            set(\"y2\", getH);\n        break;\n        case \"marker\":\n            set(\"refX\", getW);\n            set(\"markerWidth\", getW);\n            set(\"refY\", getH);\n            set(\"markerHeight\", getH);\n        break;\n        case \"radialGradient\":\n            set(\"fx\", getW);\n            set(\"fy\", getH);\n        break;\n        case \"tspan\":\n            set(\"dx\", getW);\n            set(\"dy\", getH);\n        break;\n        default:\n            set(name, getW);\n    }\n    return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n    return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n    var nodelist = glob.doc.querySelectorAll(query),\n        set = (Snap.set || Array)();\n    for (var i = 0; i < nodelist.length; i++) {\n        set.push(wrap(nodelist[i]));\n    }\n    return set;\n};\n\nfunction add2group(list) {\n    if (!is(list, \"array\")) {\n        list = Array.prototype.slice.call(arguments, 0);\n    }\n    var i = 0,\n        j = 0,\n        node = this.node;\n    while (this[i]) delete this[i++];\n    for (i = 0; i < list.length; i++) {\n        if (list[i].type == \"set\") {\n            list[i].forEach(function (el) {\n                node.appendChild(el.node);\n            });\n        } else {\n            node.appendChild(list[i].node);\n        }\n    }\n    var children = node.childNodes;\n    for (i = 0; i < children.length; i++) {\n        this[j++] = wrap(children[i]);\n    }\n    return this;\n}\nfunction Element(el) {\n    if (el.snap in hub) {\n        return hub[el.snap];\n    }\n    var id = this.id = ID(),\n        svg;\n    try {\n        svg = el.ownerSVGElement;\n    } catch(e) {}\n    this.node = el;\n    if (svg) {\n        this.paper = new Paper(svg);\n    }\n    this.type = el.tagName;\n    this.anims = {};\n    this._ = {\n        transform: []\n    };\n    el.snap = id;\n    hub[id] = this;\n    if (this.type == \"g\") {\n        this.add = add2group;\n        for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n            this[method] = Paper.prototype[method];\n        }\n    }\n}\nfunction arrayFirstValue(arr) {\n    var res;\n    for (var i = 0, ii = arr.length; i < ii; i++) {\n        res = res || arr[i];\n        if (res) {\n            return res;\n        }\n    }\n}\n(function (elproto) {\n    /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Gets or sets given attributes of the element\n     **\n     - params (object) contains key-value pairs of attributes you want to set\n     * or\n     - param (string) name of the attribute\n     = (Element) the current element\n     * or\n     = (string) value of attribute\n     > Usage\n     | el.attr({\n     |     fill: \"#fc0\",\n     |     stroke: \"#000\",\n     |     strokeWidth: 2, // CamelCase...\n     |     \"fill-opacity\": 0.5 // or dash-separated names\n     | });\n     | console.log(el.attr(\"fill\")); // #fc0\n    \\*/\n    elproto.attr = function (params, value) {\n        var el = this,\n            node = el.node;\n        if (!params) {\n            return el;\n        }\n        if (is(params, \"string\")) {\n            if (arguments.length > 1) {\n                var json = {};\n                json[params] = value;\n                params = json;\n            } else {\n                return arrayFirstValue(eve(\"snap.util.getattr.\"+params, el));\n            }\n        }\n        for (var att in params) {\n            if (params[has](att)) {\n                eve(\"snap.util.attr.\" + att, el, params[att]);\n            }\n        }\n        return el;\n    };\n// SIERRA Element.getBBox(): Unclear why you would want to express the dimension of the box as a path.\n// SIERRA Element.getBBox(): Unclear why you would want to use r0/r1/r2. Also, basic definitions: wouldn't the _smallest circle that can be enclosed_ be a zero-radius point?\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Returns the bounding box descriptor for the given element\n     **\n     = (object) bounding box descriptor:\n     o {\n     o     cx: (number) x of the center,\n     o     cy: (number) x of the center,\n     o     h: (number) height,\n     o     height: (number) height,\n     o     path: (string) path command for the box,\n     o     r0: (number) radius of a circle that fully encloses the box,\n     o     r1: (number) radius of the smallest circle that can be enclosed,\n     o     r2: (number) radius of the largest circle that can be enclosed,\n     o     vb: (string) box as a viewbox command,\n     o     w: (number) width,\n     o     width: (number) width,\n     o     x2: (number) x of the right side,\n     o     x: (number) x of the left side,\n     o     y2: (number) y of the bottom edge,\n     o     y: (number) y of the top edge\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        var el = this;\n        if (el.type == \"use\") {\n            el = el.original;\n        }\n        if (el.removed) {\n            return {};\n        }\n        var _ = el._;\n        if (isWithoutTransform) {\n            _.bboxwt = Snap.path.get[el.type] ? Snap.path.getBBox(el.realPath = Snap.path.get[el.type](el)) : Snap._.box(el.node.getBBox());\n            return Snap._.box(_.bboxwt);\n        } else {\n            el.realPath = (Snap.path.get[el.type] || Snap.path.get.deflt)(el);\n            _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, el.matrix));\n        }\n        return Snap._.box(_.bbox);\n    };\n    var propString = function () {\n        return this.string;\n    };\n// SIERRA Element.transform(): seems to allow two return values, one of which (_Element_) is undefined.\n// SIERRA Element.transform(): if this only accepts one argument, it's unclear how it can both _get_ and _set_ a transform.\n// SIERRA Element.transform(): Unclear how Snap transform string format differs from SVG's.\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Gets or sets transformation of the element\n     **\n     - tstr (string) transform string in Snap or SVG format\n     = (Element) the current element\n     * or\n     = (object) transformation descriptor:\n     o {\n     o     string (string) transform string,\n     o     globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n     o     localMatrix (Matrix) matrix of transformations applied only to the element,\n     o     diffMatrix (Matrix) matrix of difference between global and local transformations,\n     o     global (string) global transformation as string,\n     o     local (string) local transformation as string,\n     o     toString (function) returns `string` property\n     o }\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            var global = new Matrix(this.node.getCTM()),\n                local = extractTransform(this),\n                localString = local.toTransformString(),\n                string = Str(local) == Str(this.matrix) ?\n                            _.transform : localString;\n            return {\n                string: string,\n                globalMatrix: global,\n                localMatrix: local,\n                diffMatrix: global.clone().add(local.invert()),\n                global: global.toTransformString(),\n                local: localString,\n                toString: propString\n            };\n        }\n        if (tstr instanceof Matrix) {\n            // may be need to apply it directly\n            // TODO: investigate\n            tstr = tstr.toTransformString();\n        }\n        extractTransform(this, tstr);\n\n        if (this.node) {\n            if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n                $(this.node, {gradientTransform: this.matrix});\n            } else if (this.type == \"pattern\") {\n                $(this.node, {patternTransform: this.matrix});\n            } else {\n                $(this.node, {transform: this.matrix});\n            }\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.parent\n     [ method ]\n     **\n     * Returns the element's parent\n     **\n     = (Element) the parent element\n    \\*/\n    elproto.parent = function () {\n        return wrap(this.node.parentNode);\n    };\n    /*\\\n     * Element.append\n     [ method ]\n     **\n     * Appends the given element to current one\n     **\n     - el (Element|Set) element to append\n     = (Element) the parent element\n    \\*/\n    /*\\\n     * Element.add\n     [ method ]\n     **\n     * See @Element.append\n    \\*/\n    elproto.append = elproto.add = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this;\n                el.forEach(function (el) {\n                    it.add(el);\n                });\n                return this;\n            }\n            el = wrap(el);\n            this.node.appendChild(el.node);\n            el.paper = this.paper;\n        }\n        return this;\n    };\n    /*\\\n     * Element.appendTo\n     [ method ]\n     **\n     * Appends the current element to the given one\n     **\n     - el (Element) parent element to append to\n     = (Element) the child element\n    \\*/\n    elproto.appendTo = function (el) {\n        if (el) {\n            el = wrap(el);\n            el.append(this);\n        }\n        return this;\n    };\n    /*\\\n     * Element.prepend\n     [ method ]\n     **\n     * Prepends the given element to the current one\n     **\n     - el (Element) element to prepend\n     = (Element) the parent element\n    \\*/\n    elproto.prepend = function (el) {\n        if (el) {\n            el = wrap(el);\n            var parent = el.parent();\n            this.node.insertBefore(el.node, this.node.firstChild);\n            this.add && this.add();\n            el.paper = this.paper;\n            this.parent() && this.parent().add();\n            parent && parent.add();\n        }\n        return this;\n    };\n    /*\\\n     * Element.prependTo\n     [ method ]\n     **\n     * Prepends the current element to the given one\n     **\n     - el (Element) parent element to prepend to\n     = (Element) the child element\n    \\*/\n    elproto.prependTo = function (el) {\n        el = wrap(el);\n        el.prepend(this);\n        return this;\n    };\n    /*\\\n     * Element.before\n     [ method ]\n     **\n     * Inserts given element before the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.before = function (el) {\n        if (el.type == \"set\") {\n            var it = this;\n            el.forEach(function (el) {\n                var parent = el.parent();\n                it.node.parentNode.insertBefore(el.node, it.node);\n                parent && parent.add();\n            });\n            this.parent().add();\n            return this;\n        }\n        el = wrap(el);\n        var parent = el.parent();\n        this.node.parentNode.insertBefore(el.node, this.node);\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.after\n     [ method ]\n     **\n     * Inserts given element after the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.after = function (el) {\n        el = wrap(el);\n        var parent = el.parent();\n        if (this.node.nextSibling) {\n            this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n        } else {\n            this.node.parentNode.appendChild(el.node);\n        }\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertBefore = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertAfter = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the DOM\n     = (Element) the detached element\n    \\*/\n    elproto.remove = function () {\n        var parent = this.parent();\n        this.node.parentNode && this.node.parentNode.removeChild(this.node);\n        delete this.paper;\n        this.removed = true;\n        parent && parent.add();\n        return this;\n    };\n    /*\\\n     * Element.select\n     [ method ]\n     **\n     * Gathers the nested @Element matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Element) result of query selection\n    \\*/\n    elproto.select = function (query) {\n        return wrap(this.node.querySelector(query));\n    };\n    /*\\\n     * Element.selectAll\n     [ method ]\n     **\n     * Gathers nested @Element objects matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Set|array) result of query selection\n    \\*/\n    elproto.selectAll = function (query) {\n        var nodelist = this.node.querySelectorAll(query),\n            set = (Snap.set || Array)();\n        for (var i = 0; i < nodelist.length; i++) {\n            set.push(wrap(nodelist[i]));\n        }\n        return set;\n    };\n    /*\\\n     * Element.asPX\n     [ method ]\n     **\n     * Returns given attribute of the element as a `px` value (not %, em, etc.)\n     **\n     - attr (string) attribute name\n     - value (string) #optional attribute value\n     = (Element) result of query selection\n    \\*/\n    elproto.asPX = function (attr, value) {\n        if (value == null) {\n            value = this.attr(attr);\n        }\n        return +unit2px(this, attr, value);\n    };\n    // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned <use> instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n    /*\\\n     * Element.use\n     [ method ]\n     **\n     * Creates a `<use>` element linked to the current element\n     **\n     = (Element) the `<use>` element\n    \\*/\n    elproto.use = function () {\n        var use,\n            id = this.node.id;\n        if (!id) {\n            id = this.id;\n            $(this.node, {\n                id: id\n            });\n        }\n        if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n            this.type == \"pattern\") {\n            use = make(this.type, this.node.parentNode);\n        } else {\n            use = make(\"use\", this.node.parentNode);\n        }\n        $(use.node, {\n            \"xlink:href\": \"#\" + id\n        });\n        use.original = this;\n        return use;\n    };\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     * Creates a clone of the element and inserts it after the element\n     **\n     = (Element) the clone\n    \\*/\n    function fixids(el) {\n        var els = el.selectAll(\"*\"),\n            it,\n            url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n            ids = [],\n            uses = {};\n        function urltest(it, name) {\n            var val = $(it.node, name);\n            val = val && val.match(url);\n            val = val && val[2];\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    var attr = {};\n                    attr[name] = URL(id);\n                    $(it.node, attr);\n                });\n            }\n        }\n        function linktest(it) {\n            var val = $(it.node, \"xlink:href\");\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    it.attr(\"xlink:href\", \"#\" + id);\n                });\n            }\n        }\n        for (var i = 0, ii = els.length; i < ii; i++) {\n            it = els[i];\n            urltest(it, \"fill\");\n            urltest(it, \"stroke\");\n            urltest(it, \"filter\");\n            urltest(it, \"mask\");\n            urltest(it, \"clip-path\");\n            linktest(it);\n            var oldid = $(it.node, \"id\");\n            if (oldid) {\n                $(it.node, {id: it.id});\n                ids.push({\n                    old: oldid,\n                    id: it.id\n                });\n            }\n        }\n        for (i = 0, ii = ids.length; i < ii; i++) {\n            var fs = uses[ids[i].old];\n            if (fs) {\n                for (var j = 0, jj = fs.length; j < jj; j++) {\n                    fs[j](ids[i].id);\n                }\n            }\n        }\n    }\n    elproto.clone = function () {\n        var clone = wrap(this.node.cloneNode(true));\n        if ($(clone.node, \"id\")) {\n            $(clone.node, {id: clone.id});\n        }\n        fixids(clone);\n        clone.insertAfter(this);\n        return clone;\n    };\n// SIERRA Element.toDefs(): If this _moves_ an element to the <defs> region, why is the return value a _clone_? Also unclear why it's called the _relative_ <defs> section. Perhaps _shared_?\n    /*\\\n     * Element.toDefs\n     [ method ]\n     **\n     * Moves element to the shared `<defs>` area\n     **\n     = (Element) the clone\n    \\*/\n    elproto.toDefs = function () {\n        var defs = getSomeDefs(this);\n        defs.appendChild(this.node);\n        return this;\n    };\n// SIERRA Element.pattern(): x/y/width/height data types are listed as both String and Number. Is that an error, or does it mean strings are coerced?\n// SIERRA Element.pattern(): clarify that x/y are offsets that e.g., may add gutters between the tiles.\n    /*\\\n     * Element.pattern\n     [ method ]\n     **\n     * Creates a `<pattern>` element from the current element\n     **\n     * To create a pattern you have to specify the pattern rect:\n     - x (string|number)\n     - y (string|number)\n     - width (string|number)\n     - height (string|number)\n     = (Element) the `<pattern>` element\n     * You can use pattern later on as an argument for `fill` attribute:\n     | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n     |         fill: \"none\",\n     |         stroke: \"#bada55\",\n     |         strokeWidth: 5\n     |     }).pattern(0, 0, 10, 10),\n     |     c = paper.circle(200, 200, 100);\n     | c.attr({\n     |     fill: p\n     | });\n    \\*/\n    elproto.pattern = function (x, y, width, height) {\n        var p = make(\"pattern\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        $(p.node, {\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            patternUnits: \"userSpaceOnUse\",\n            id: p.id,\n            viewBox: [x, y, width, height].join(\" \")\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values.  Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where?  Couldn't they also be assigned default values?\n    /*\\\n     * Element.marker\n     [ method ]\n     **\n     * Creates a `<marker>` element from the current element\n     **\n     * To create a marker you have to specify the bounding rect and reference point:\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - refX (number)\n     - refY (number)\n     = (Element) the `<marker>` element\n     * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n    \\*/\n    // TODO add usage for markers\n    elproto.marker = function (x, y, width, height, refX, refY) {\n        var p = make(\"marker\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            refX = x.refX || x.cx;\n            refY = x.refY || x.cy;\n            x = x.x;\n        }\n        $(p.node, {\n            viewBox: [x, y, width, height].join(S),\n            markerWidth: width,\n            markerHeight: height,\n            orient: \"auto\",\n            refX: refX || 0,\n            refY: refY || 0,\n            id: p.id\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n    // animation\n    function slice(from, to, f) {\n        return function (arr) {\n            var res = arr.slice(from, to);\n            if (res.length == 1) {\n                res = res[0];\n            }\n            return f ? f(res) : res;\n        };\n    }\n    var Animation = function (attr, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        this.attr = attr;\n        this.dur = ms;\n        easing && (this.easing = easing);\n        callback && (this.callback = callback);\n    };\n    // SIERRA All object methods should feature sample code. This is just one instance.\n    /*\\\n     * Snap.animation\n     [ method ]\n     **\n     * Creates an animation object\n     **\n     - attr (object) attributes of final destination\n     - duration (number) duration of the animation, in milliseconds\n     - easing (function) #optional one of easing functions of @mina or custom one\n     - callback (function) #optional callback function that fires when animation ends\n     = (object) animation object\n    \\*/\n    Snap.animation = function (attr, ms, easing, callback) {\n        return new Animation(attr, ms, easing, callback);\n    };\n    /*\\\n     * Element.inAnim\n     [ method ]\n     **\n     * Returns a set of animations that may be able to manipulate the current element\n     **\n     = (object) in format:\n     o {\n     o     anim (object) animation object,\n     o     curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    elproto.inAnim = function () {\n        var el = this,\n            res = [];\n        for (var id in el.anims) if (el.anims[has](id)) {\n            (function (a) {\n                res.push({\n                    anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n                    curStatus: a.status(),\n                    status: function (val) {\n                        return a.status(val);\n                    },\n                    stop: function () {\n                        a.stop();\n                    }\n                });\n            }(el.anims[id]));\n        }\n        return res;\n    };\n    /*\\\n     * Snap.animate\n     [ method ]\n     **\n     * Runs generic animation of one number into another with a caring function\n     **\n     - from (number|array) number or array of numbers\n     - to (number|array) number or array of numbers\n     - setter (function) caring function that accepts one number argument\n     - duration (number) duration, in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function to execute when animation ends\n     = (object) animation object in @mina format\n     o {\n     o     id (string) animation id, consider it read-only,\n     o     duration (function) gets or sets the duration of the animation,\n     o     easing (function) easing,\n     o     speed (function) gets or sets the speed of the animation,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n     | var rect = Snap().rect(0, 0, 10, 10);\n     | Snap.animate(0, 10, function (val) {\n     |     rect.attr({\n     |         x: val\n     |     });\n     | }, 1000);\n     | // in given context is equivalent to\n     | rect.animate({x: 10}, 1000);\n    \\*/\n    Snap.animate = function (from, to, setter, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        var now = mina.time(),\n            anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n        callback && eve.once(\"mina.finish.\" + anim.id, callback);\n        return anim;\n    };\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops all the animations for the current element\n     **\n     = (Element) the current element\n    \\*/\n    elproto.stop = function () {\n        var anims = this.inAnim();\n        for (var i = 0, ii = anims.length; i < ii; i++) {\n            anims[i].stop();\n        }\n        return this;\n    };\n    // SIERRA Element.animate(): For _attrs_, clarify if they represent the destination values, and if the animation executes relative to the element's current attribute values.\n    // SIERRA would a _custom_ animation function be an SVG keySplines value?\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Animates the given attributes of the element\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     = (Element) the current element\n    \\*/\n    elproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = easing.dur;\n            attrs = attrs.attr;\n        }\n        var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n            el = this;\n        for (var key in attrs) if (attrs[has](key)) {\n            if (el.equal) {\n                eq = el.equal(key, Str(attrs[key]));\n                from = eq.from;\n                to = eq.to;\n                f = eq.f;\n            } else {\n                from = +el.attr(key);\n                to = +attrs[key];\n            }\n            var len = is(from, \"array\") ? from.length : 1;\n            keys[key] = slice(fkeys.length, fkeys.length + len, f);\n            fkeys = fkeys.concat(from);\n            tkeys = tkeys.concat(to);\n        }\n        var now = mina.time(),\n            anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n                var attr = {};\n                for (var key in keys) if (keys[has](key)) {\n                    attr[key] = keys[key](val);\n                }\n                el.attr(attr);\n            }, easing);\n        el.anims[anim.id] = anim;\n        anim._attrs = attrs;\n        anim._callback = callback;\n        eve.once(\"mina.finish.\" + anim.id, function () {\n            delete el.anims[anim.id];\n            callback && callback.call(el);\n        });\n        eve.once(\"mina.stop.\" + anim.id, function () {\n            delete el.anims[anim.id];\n        });\n        return el;\n    };\n    var eldata = {};\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key. (Don’t confuse\n     * with `data-` attributes)\n     *\n     * See also @Element.removeData\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 0){\n            eve(\"snap.data.get.\" + this.id, this, data, null);\n            return data;\n        }\n        if (arguments.length == 1) {\n            if (Snap.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"snap.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"snap.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            eldata[this.id] = {};\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n    /*\\\n     * Element.outerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n     *\n     * See also @Element.innerSVG\n     = (string) SVG code for the element\n    \\*/\n    /*\\\n     * Element.toString\n     [ method ]\n     **\n     * See @Element.outerSVG\n    \\*/\n    elproto.outerSVG = elproto.toString = toString(1);\n    /*\\\n     * Element.innerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.innerSVG = toString();\n    function toString(type) {\n        return function () {\n            var res = type ? \"<\" + this.type : \"\",\n                attr = this.node.attributes,\n                chld = this.node.childNodes;\n            if (type) {\n                for (var i = 0, ii = attr.length; i < ii; i++) {\n                    res += \" \" + attr[i].name + '=\"' +\n                            attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n                }\n            }\n            if (chld.length) {\n                type && (res += \">\");\n                for (i = 0, ii = chld.length; i < ii; i++) {\n                    if (chld[i].nodeType == 3) {\n                        res += chld[i].nodeValue;\n                    } else if (chld[i].nodeType == 1) {\n                        res += wrap(chld[i]).toString();\n                    }\n                }\n                type && (res += \"</\" + this.type + \">\");\n            } else {\n                type && (res += \"/>\");\n            }\n            return res;\n        };\n    }\n}(Element.prototype));\n// SIERRA Snap.parse() accepts & returns a fragment, but there's no info on what it does in between. What if it doesn't parse?\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n    var f = glob.doc.createDocumentFragment(),\n        full = true,\n        div = glob.doc.createElement(\"div\");\n    svg = Str(svg);\n    if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n        svg = \"<svg>\" + svg + \"</svg>\";\n        full = false;\n    }\n    div.innerHTML = svg;\n    svg = div.getElementsByTagName(\"svg\")[0];\n    if (svg) {\n        if (full) {\n            f = svg;\n        } else {\n            while (svg.firstChild) {\n                f.appendChild(svg.firstChild);\n            }\n        }\n    }\n    div.innerHTML = E;\n    return new Fragment(f);\n};\nfunction Fragment(frag) {\n    this.node = frag;\n}\n/*\\\n * Fragment.select\n [ method ]\n **\n * See @Element.select\n\\*/\nFragment.prototype.select = Element.prototype.select;\n/*\\\n * Fragment.selectAll\n [ method ]\n **\n * See @Element.selectAll\n\\*/\nFragment.prototype.selectAll = Element.prototype.selectAll;\n// SIERRA Snap.fragment() could especially use a code example\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n    var args = Array.prototype.slice.call(arguments, 0),\n        f = glob.doc.createDocumentFragment();\n    for (var i = 0, ii = args.length; i < ii; i++) {\n        var item = args[i];\n        if (item.node && item.node.nodeType) {\n            f.appendChild(item.node);\n        }\n        if (item.nodeType) {\n            f.appendChild(item);\n        }\n        if (typeof item == \"string\") {\n            f.appendChild(Snap.parse(item).node);\n        }\n    }\n    return new Fragment(f);\n};\n\nfunction make(name, parent) {\n    var res = $(name);\n    parent.appendChild(res);\n    var el = wrap(res);\n    el.type = name;\n    return el;\n}\nfunction Paper(w, h) {\n    var res,\n        desc,\n        defs,\n        proto = Paper.prototype;\n    if (w && w.tagName == \"svg\") {\n        if (w.snap in hub) {\n            return hub[w.snap];\n        }\n        res = new Element(w);\n        desc = w.getElementsByTagName(\"desc\")[0];\n        defs = w.getElementsByTagName(\"defs\")[0];\n        if (!desc) {\n            desc = $(\"desc\");\n            desc.appendChild(glob.doc.createTextNode(\"Created with Snap\"));\n            res.node.appendChild(desc);\n        }\n        if (!defs) {\n            defs = $(\"defs\");\n            res.node.appendChild(defs);\n        }\n        res.defs = defs;\n        for (var key in proto) if (proto[has](key)) {\n            res[key] = proto[key];\n        }\n        res.paper = res.root = res;\n    } else {\n        res = make(\"svg\", glob.doc.body);\n        $(res.node, {\n            height: h,\n            version: 1.1,\n            width: w,\n            xmlns: xmlns\n        });\n    }\n    return res;\n}\nfunction wrap(dom) {\n    if (!dom) {\n        return dom;\n    }\n    if (dom instanceof Element || dom instanceof Fragment) {\n        return dom;\n    }\n    if (dom.tagName == \"svg\") {\n        return new Paper(dom);\n    }\n    return new Element(dom);\n}\n// gradients' helpers\nfunction Gstops() {\n    return this.selectAll(\"stop\");\n}\nfunction GaddStop(color, offset) {\n    var stop = $(\"stop\"),\n        attr = {\n            offset: +offset + \"%\"\n        };\n    color = Snap.color(color);\n    attr[\"stop-color\"] = color.hex;\n    if (color.opacity < 1) {\n        attr[\"stop-opacity\"] = color.opacity;\n    }\n    $(stop, attr);\n    this.node.appendChild(stop);\n    return this;\n}\nfunction GgetBBox() {\n    if (this.type == \"linearGradient\") {\n        var x1 = $(this.node, \"x1\") || 0,\n            x2 = $(this.node, \"x2\") || 1,\n            y1 = $(this.node, \"y1\") || 0,\n            y2 = $(this.node, \"y2\") || 0;\n        return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n    } else {\n        var cx = this.node.cx || .5,\n            cy = this.node.cy || .5,\n            r = this.node.r || 0;\n        return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n    }\n}\nfunction gradient(defs, str) {\n    var grad = arrayFirstValue(eve(\"snap.util.grad.parse\", null, str)),\n        el;\n    if (!grad) {\n        return null;\n    }\n    grad.params.unshift(defs);\n    if (grad.type.toLowerCase() == \"l\") {\n        el = gradientLinear.apply(0, grad.params);\n    } else {\n        el = gradientRadial.apply(0, grad.params);\n    }\n    if (grad.type != grad.type.toLowerCase()) {\n        $(el.node, {\n            gradientUnits: \"userSpaceOnUse\"\n        });\n    }\n    var stops = grad.stops,\n        len = stops.length,\n        start = 0,\n        j = 0;\n    function seed(i, end) {\n        var step = (end - start) / (i - j);\n        for (var k = j; k < i; k++) {\n            stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n        }\n        j = i;\n        start = end;\n    }\n    len--;\n    for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n        seed(i, stops[i].offset);\n    }\n    stops[len].offset = stops[len].offset || 100;\n    seed(len, stops[len].offset);\n    for (i = 0; i <= len; i++) {\n        var stop = stops[i];\n        el.addStop(stop.color, stop.offset);\n    }\n    return el;\n}\nfunction gradientLinear(defs, x1, y1, x2, y2) {\n    var el = make(\"linearGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (x1 != null) {\n        $(el.node, {\n            x1: x1,\n            y1: y1,\n            x2: x2,\n            y2: y2\n        });\n    }\n    return el;\n}\nfunction gradientRadial(defs, cx, cy, r, fx, fy) {\n    var el = make(\"radialGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (cx != null) {\n        $(el.node, {\n            cx: cx,\n            cy: cy,\n            r: r\n        });\n    }\n    if (fx != null && fy != null) {\n        $(el.node, {\n            fx: fx,\n            fy: fy\n        });\n    }\n    return el;\n}\n// Paper prototype methods\n(function (proto) {\n    /*\\\n     * Paper.el\n     [ method ]\n     **\n     * Creates an element on paper with a given name and no attributes\n     **\n     - name (string) tag name\n     - attr (object) attributes\n     = (Element) the current element\n     > Usage\n     | var c = paper.circle(10, 10, 10); // is the same as...\n     | var c = paper.el(\"circle\").attr({\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n     | // and the same as\n     | var c = paper.el(\"circle\", {\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n    \\*/\n    proto.el = function (name, attr) {\n        return make(name, this.node).attr(attr);\n    };\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - rx (number) #optional horizontal radius for rounded corners, default is 0\n     - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n     = (object) the `rect` element\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    proto.rect = function (x, y, w, h, rx, ry) {\n        var attr;\n        if (ry == null) {\n            ry = rx;\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                width: w,\n                height: h\n            };\n            if (rx != null) {\n                attr.rx = rx;\n                attr.ry = ry;\n            }\n        }\n        return this.el(\"rect\", attr);\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) the `circle` element\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    proto.circle = function (cx, cy, r) {\n        var attr;\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            attr = cx;\n        } else if (cx != null) {\n            attr = {\n                cx: cx,\n                cy: cy,\n                r: r\n            };\n        }\n        return this.el(\"circle\", attr);\n    };\n\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Places an image on the surface\n     **\n     - src (string) URI of the source image\n     - x (number) x offset position\n     - y (number) y offset position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) the `image` element\n     * or\n     = (object) Snap element object with type `image`\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    proto.image = function (src, x, y, width, height) {\n        var el = make(\"image\", this.node);\n        if (is(src, \"object\") && \"src\" in src) {\n            el.attr(src);\n        } else if (src != null) {\n            var set = {\n                \"xlink:href\": src,\n                preserveAspectRatio: \"none\"\n            };\n            if (x != null && y != null) {\n                set.x = x;\n                set.y = y;\n            }\n            if (width != null && height != null) {\n                set.width = width;\n                set.height = height;\n            } else {\n                preload(src, function () {\n                    $(el.node, {\n                        width: this.offsetWidth,\n                        height: this.offsetHeight\n                    });\n                });\n            }\n            $(el.node, set);\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) the `ellipse` element\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    proto.ellipse = function (cx, cy, rx, ry) {\n        var el = make(\"ellipse\", this.node);\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            el.attr(cx);\n        } else if (cx != null) {\n            el.attr({\n                cx: cx,\n                cy: cy,\n                rx: rx,\n                ry: ry\n            });\n        }\n        return el;\n    };\n    // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a `<path>` element using the given string as the path's definition\n     - pathString (string) #optional path string in SVG format\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n     | \"M10,20L30,40\"\n     * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n     * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n    \\*/\n    proto.path = function (d) {\n        var el = make(\"path\", this.node);\n        if (is(d, \"object\") && !is(d, \"array\")) {\n            el.attr(d);\n        } else if (d) {\n            el.attr({\n                d: d\n            });\n        }\n        return el;\n    };\n// SIERRA Paper.g(): Don't understand the code comment about the order being _different._ Wouldn't it be a rect followed by a circle?\n    /*\\\n     * Paper.g\n     [ method ]\n     **\n     * Creates a group element\n     **\n     - varargs (…) #optional elements to nest within the group\n     = (object) the `g` element\n     **\n     > Usage\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g(c2, c1); // note that the order of elements is different\n     * or\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g();\n     | g.add(c2, c1);\n    \\*/\n    /*\\\n     * Paper.group\n     [ method ]\n     **\n     * See @Paper.g\n    \\*/\n    proto.group = proto.g = function (first) {\n        var el = make(\"g\", this.node);\n        el.add = add2group;\n        for (var method in proto) if (proto[has](method)) {\n            el[method] = proto[method];\n        }\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string|array) The text string to draw or array of strings to nest within separate `<tspan>` elements\n     = (object) the `text` element\n     **\n     > Usage\n     | var t1 = paper.text(50, 50, \"Snap\");\n     | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n     | // Text path usage\n     | t1.attr({textpath: \"M10,10L100,100\"});\n     | // or\n     | var pth = paper.path(\"M10,10L100,100\");\n     | t1.attr({textpath: pth});\n    \\*/\n    proto.text = function (x, y, text) {\n        var el = make(\"text\", this.node);\n        if (is(x, \"object\")) {\n            el.attr(x);\n        } else if (x != null) {\n            el.attr({\n                x: x,\n                y: y,\n                text: text || \"\"\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.line\n     [ method ]\n     **\n     * Draws a line\n     **\n     - x1 (number) x coordinate position of the start\n     - y1 (number) y coordinate position of the start\n     - x2 (number) x coordinate position of the end\n     - y2 (number) y coordinate position of the end\n     = (object) the `line` element\n     **\n     > Usage\n     | var t1 = paper.line(50, 50, 100, 100);\n    \\*/\n    proto.line = function (x1, y1, x2, y2) {\n        var el = make(\"line\", this.node);\n        if (is(x1, \"object\")) {\n            el.attr(x1);\n        } else if (x1 != null) {\n            el.attr({\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polyline\n     [ method ]\n     **\n     * Draws a polyline\n     **\n     - points (array) array of points\n     * or\n     - varargs (…) points\n     = (object) the `polyline` element\n     **\n     > Usage\n     | var p1 = paper.polyline([10, 10, 100, 100]);\n     | var p2 = paper.polyline(10, 10, 100, 100);\n    \\*/\n    proto.polyline = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polyline\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polygon\n     [ method ]\n     **\n     * Draws a polygon. See @Paper.polyline\n    \\*/\n    proto.polygon = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polygon\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    // gradients\n    (function () {\n        /*\\\n         * Paper.gradient\n         [ method ]\n         **\n         * Creates a gradient element\n         **\n         - gradient (string) gradient descriptor\n         > Gradient Descriptor\n         * The gradient descriptor is an expression formatted as\n         * follows: `<type>(<coords>)<colors>`.  The `<type>` can be\n         * either linear or radial.  The uppercase `L` or `R` letters\n         * indicate absolute coordinates offset from the SVG surface.\n         * Lowercase `l` or `r` letters indicate coordinates\n         * calculated relative to the element to which the gradient is\n         * applied.  Coordinates specify a linear gradient vector as\n         * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n         * `r` and optional `fx`, `fy` specifying a focal point away\n         * from the center of the circle. Specify `<colors>` as a list\n         * of dash-separated CSS color values.  Each color may be\n         * followed by a custom offset value, separated with a colon\n         * character.\n         > Examples\n         * Linear gradient, relative from top-left corner to bottom-right\n         * corner, from black through red to white:\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         * Linear gradient, absolute from (0, 0) to (100, 100), from black\n         * through red at 25% to white:\n         | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25%-#fff\");\n         * Radial gradient, relative from the center of the element with radius\n         * half the width, from black to white:\n         | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n         * To apply the gradient:\n         | paper.circle(50, 50, 40).attr({\n         |     fill: g\n         | });\n         = (object) the `gradient` element\n        \\*/\n        proto.gradient = function (str) {\n            return gradient(this.defs, str);\n        };\n        proto.gradientLinear = function (x1, y1, x2, y2) {\n            return gradientLinear(this.defs, x1, y1, x2, y2);\n        };\n        proto.gradientRadial = function (cx, cy, r, fx, fy) {\n            return gradientRadial(this.defs, cx, cy, r, fx, fy);\n        };\n        /*\\\n         * Paper.toString\n         [ method ]\n         **\n         * Returns SVG code for the @Paper\n         = (string) SVG code for the @Paper\n        \\*/\n        proto.toString = function () {\n            var f = glob.doc.createDocumentFragment(),\n                d = glob.doc.createElement(\"div\"),\n                svg = this.node.cloneNode(true),\n                res;\n            f.appendChild(d);\n            d.appendChild(svg);\n            $(svg, {xmlns: xmlns});\n            res = d.innerHTML;\n            f.removeChild(f.firstChild);\n            return res;\n        };\n        /*\\\n         * Paper.clear\n         [ method ]\n         **\n         * Removes all child nodes of the paper, except <defs>.\n        \\*/\n        proto.clear = function () {\n            var node = this.node.firstChild,\n                next;\n            while (node) {\n                next = node.nextSibling;\n                if (node.tagName != \"defs\") {\n                    node.parentNode.removeChild(node);\n                }\n                node = next;\n            }\n        };\n    }());\n}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n    var req = new XMLHttpRequest,\n        id = ID();\n    if (req) {\n        if (is(postData, \"function\")) {\n            scope = callback;\n            callback = postData;\n            postData = null;\n        } else if (is(postData, \"object\")) {\n            var pd = [];\n            for (var key in postData) if (postData.hasOwnProperty(key)) {\n                pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n            }\n            postData = pd.join(\"&\");\n        }\n        req.open((postData ? \"POST\" : \"GET\"), url, true);\n        req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n        if (postData) {\n            req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n        }\n        if (callback) {\n            eve.once(\"snap.ajax.\" + id + \".0\", callback);\n            eve.once(\"snap.ajax.\" + id + \".200\", callback);\n            eve.once(\"snap.ajax.\" + id + \".304\", callback);\n        }\n        req.onreadystatechange = function() {\n            if (req.readyState != 4) return;\n            eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n        };\n        if (req.readyState == 4) {\n            return req;\n        }\n        req.send(postData);\n        return req;\n    }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n    Snap.ajax(url, function (req) {\n        var f = Snap.parse(req.responseText);\n        scope ? callback.call(scope, f) : callback(f);\n    });\n};\n\n// Attributes event handlers\neve.on(\"snap.util.attr.mask\", function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value.type == \"mask\") {\n            var mask = value;\n        } else {\n            mask = make(\"mask\", getSomeDefs(this));\n            mask.node.appendChild(value.node);\n            !mask.node.id && $(mask.node, {\n                id: mask.id\n            });\n        }\n        $(this.node, {\n            mask: URL(mask.id)\n        });\n    }\n});\n(function (clipIt) {\n    eve.on(\"snap.util.attr.clip\", clipIt);\n    eve.on(\"snap.util.attr.clip-path\", clipIt);\n    eve.on(\"snap.util.attr.clipPath\", clipIt);\n}(function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value.type == \"clipPath\") {\n            var clip = value;\n        } else {\n            clip = make(\"clipPath\", getSomeDefs(this));\n            clip.node.appendChild(value.node);\n            !clip.node.id && $(clip.node, {\n                id: clip.id\n            });\n        }\n        $(this.node, {\n            \"clip-path\": URL(clip.id)\n        });\n    }\n}));\nfunction fillStroke(name) {\n    return function (value) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n            (value.node.firstChild.tagName == \"radialGradient\" ||\n            value.node.firstChild.tagName == \"linearGradient\" ||\n            value.node.firstChild.tagName == \"pattern\")) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value instanceof Element) {\n            if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n               || value.type == \"pattern\") {\n                if (!value.node.id) {\n                    $(value.node, {\n                        id: value.id\n                    });\n                }\n                var fill = URL(value.node.id);\n            } else {\n                fill = value.attr(name);\n            }\n        } else {\n            fill = Snap.color(value);\n            if (fill.error) {\n                var grad = gradient(getSomeDefs(this), value);\n                if (grad) {\n                    if (!grad.node.id) {\n                        $(grad.node, {\n                            id: grad.id\n                        });\n                    }\n                    fill = URL(grad.node.id);\n                } else {\n                    fill = value;\n                }\n            } else {\n                fill = Str(fill);\n            }\n        }\n        var attrs = {};\n        attrs[name] = fill;\n        $(this.node, attrs);\n        this.node.style[name] = E;\n    };\n}\neve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\neve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\nvar gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\neve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n    string = Str(string);\n    var tokens = string.match(gradrg);\n    if (!tokens) {\n        return null;\n    }\n    var type = tokens[1],\n        params = tokens[2],\n        stops = tokens[3];\n    params = params.split(/\\s*,\\s*/).map(function (el) {\n        return +el == el ? +el : el;\n    });\n    if (params.length == 1 && params[0] == 0) {\n        params = [];\n    }\n    stops = stops.split(\"-\");\n    stops = stops.map(function (el) {\n        el = el.split(\":\");\n        var out = {\n            color: el[0]\n        };\n        if (el[1]) {\n            out.offset = el[1];\n        }\n        return out;\n    });\n    return {\n        type: type,\n        params: params,\n        stops: stops\n    };\n});\n\neve.on(\"snap.util.attr.d\", function (value) {\n    eve.stop();\n    if (is(value, \"array\") && is(value[0], \"array\")) {\n        value = Snap.path.toString.call(value);\n    }\n    value = Str(value);\n    if (value.match(/[ruo]/i)) {\n        value = Snap.path.toAbsolute(value);\n    }\n    $(this.node, {d: value});\n})(-1);\neve.on(\"snap.util.attr.#text\", function (value) {\n    eve.stop();\n    value = Str(value);\n    var txt = glob.doc.createTextNode(value);\n    while (this.node.firstChild) {\n        this.node.removeChild(this.node.firstChild);\n    }\n    this.node.appendChild(txt);\n})(-1);\neve.on(\"snap.util.attr.path\", function (value) {\n    eve.stop();\n    this.attr({d: value});\n})(-1);\neve.on(\"snap.util.attr.viewBox\", function (value) {\n    var vb;\n    if (is(value, \"object\") && \"x\" in value) {\n        vb = [value.x, value.y, value.width, value.height].join(\" \");\n    } else if (is(value, \"array\")) {\n        vb = value.join(\" \");\n    } else {\n        vb = value;\n    }\n    $(this.node, {\n        viewBox: vb\n    });\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.transform\", function (value) {\n    this.transform(value);\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.r\", function (value) {\n    if (this.type == \"rect\") {\n        eve.stop();\n        $(this.node, {\n            rx: value,\n            ry: value\n        });\n    }\n})(-1);\neve.on(\"snap.util.attr.textpath\", function (value) {\n    eve.stop();\n    if (this.type == \"text\") {\n        var id, tp, node;\n        if (!value && this.textPath) {\n            tp = this.textPath;\n            while (tp.node.firstChild) {\n                this.node.appendChild(tp.node.firstChild);\n            }\n            tp.remove();\n            delete this.textPath;\n            return;\n        }\n        if (is(value, \"string\")) {\n            var defs = getSomeDefs(this),\n                path = wrap(defs.parentNode).path(value);\n            defs.appendChild(path.node);\n            id = path.id;\n            path.attr({id: id});\n        } else {\n            value = wrap(value);\n            if (value instanceof Element) {\n                id = value.attr(\"id\");\n                if (!id) {\n                    id = value.id;\n                    value.attr({id: id});\n                }\n            }\n        }\n        if (id) {\n            tp = this.textPath;\n            node = this.node;\n            if (tp) {\n                tp.attr({\"xlink:href\": \"#\" + id});\n            } else {\n                tp = $(\"textPath\", {\n                    \"xlink:href\": \"#\" + id\n                });\n                while (node.firstChild) {\n                    tp.appendChild(node.firstChild);\n                }\n                node.appendChild(tp);\n                this.textPath = wrap(tp);\n            }\n        }\n    }\n})(-1);\neve.on(\"snap.util.attr.text\", function (value) {\n    if (this.type == \"text\") {\n        var i = 0,\n            node = this.node,\n            tuner = function (chunk) {\n                var out = $(\"tspan\");\n                if (is(chunk, \"array\")) {\n                    for (var i = 0; i < chunk.length; i++) {\n                        out.appendChild(tuner(chunk[i]));\n                    }\n                } else {\n                    out.appendChild(glob.doc.createTextNode(chunk));\n                }\n                out.normalize && out.normalize();\n                return out;\n            };\n        while (node.firstChild) {\n            node.removeChild(node.firstChild);\n        }\n        var tuned = tuner(value);\n        while (tuned.firstChild) {\n            node.appendChild(tuned.firstChild);\n        }\n    }\n    eve.stop();\n})(-1);\n// default\nvar cssAttr = {\n    \"alignment-baseline\": 0,\n    \"baseline-shift\": 0,\n    \"clip\": 0,\n    \"clip-path\": 0,\n    \"clip-rule\": 0,\n    \"color\": 0,\n    \"color-interpolation\": 0,\n    \"color-interpolation-filters\": 0,\n    \"color-profile\": 0,\n    \"color-rendering\": 0,\n    \"cursor\": 0,\n    \"direction\": 0,\n    \"display\": 0,\n    \"dominant-baseline\": 0,\n    \"enable-background\": 0,\n    \"fill\": 0,\n    \"fill-opacity\": 0,\n    \"fill-rule\": 0,\n    \"filter\": 0,\n    \"flood-color\": 0,\n    \"flood-opacity\": 0,\n    \"font\": 0,\n    \"font-family\": 0,\n    \"font-size\": 0,\n    \"font-size-adjust\": 0,\n    \"font-stretch\": 0,\n    \"font-style\": 0,\n    \"font-variant\": 0,\n    \"font-weight\": 0,\n    \"glyph-orientation-horizontal\": 0,\n    \"glyph-orientation-vertical\": 0,\n    \"image-rendering\": 0,\n    \"kerning\": 0,\n    \"letter-spacing\": 0,\n    \"lighting-color\": 0,\n    \"marker\": 0,\n    \"marker-end\": 0,\n    \"marker-mid\": 0,\n    \"marker-start\": 0,\n    \"mask\": 0,\n    \"opacity\": 0,\n    \"overflow\": 0,\n    \"pointer-events\": 0,\n    \"shape-rendering\": 0,\n    \"stop-color\": 0,\n    \"stop-opacity\": 0,\n    \"stroke\": 0,\n    \"stroke-dasharray\": 0,\n    \"stroke-dashoffset\": 0,\n    \"stroke-linecap\": 0,\n    \"stroke-linejoin\": 0,\n    \"stroke-miterlimit\": 0,\n    \"stroke-opacity\": 0,\n    \"stroke-width\": 0,\n    \"text-anchor\": 0,\n    \"text-decoration\": 0,\n    \"text-rendering\": 0,\n    \"unicode-bidi\": 0,\n    \"visibility\": 0,\n    \"word-spacing\": 0,\n    \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n    var att = eve.nt(),\n        attr = {};\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    attr[att] = value;\n    var style = att.replace(/-(\\w)/gi, function (all, letter) {\n            return letter.toUpperCase();\n        }),\n        css = att.replace(/[A-Z]/g, function (letter) {\n            return \"-\" + letter.toLowerCase();\n        });\n    if (cssAttr[has](css)) {\n        this.node.style[style] = value == null ? E : value;\n    } else {\n        $(this.node, attr);\n    }\n});\neve.on(\"snap.util.getattr.transform\", function () {\n    eve.stop();\n    return this.transform();\n})(-1);\neve.on(\"snap.util.getattr.textpath\", function () {\n    eve.stop();\n    return this.textPath;\n})(-1);\n// Markers\n(function () {\n    function getter(end) {\n        return function () {\n            eve.stop();\n            var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n            if (style == \"none\") {\n                return style;\n            } else {\n                return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n            }\n        };\n    }\n    function setter(end) {\n        return function (value) {\n            eve.stop();\n            var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n            if (value == \"\" || !value) {\n                this.node.style[name] = \"none\";\n                return;\n            }\n            if (value.type == \"marker\") {\n                var id = value.node.id;\n                if (!id) {\n                    $(value.node, {id: value.id});\n                }\n                this.node.style[name] = URL(id);\n                return;\n            }\n        };\n    }\n    eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n}());\neve.on(\"snap.util.getattr.r\", function () {\n    if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n        eve.stop();\n        return $(this.node, \"rx\");\n    }\n})(-1);\nfunction textExtract(node) {\n    var out = [];\n    var children = node.childNodes;\n    for (var i = 0, ii = children.length; i < ii; i++) {\n        var chi = children[i];\n        if (chi.nodeType == 3) {\n            out.push(chi.nodeValue);\n        }\n        if (chi.tagName == \"tspan\") {\n            if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n                out.push(chi.firstChild.nodeValue);\n            } else {\n                out.push(textExtract(chi));\n            }\n        }\n    }\n    return out;\n}\neve.on(\"snap.util.getattr.text\", function () {\n    if (this.type == \"text\" || this.type == \"tspan\") {\n        eve.stop();\n        var out = textExtract(this.node);\n        return out.length == 1 ? out[0] : out;\n    }\n})(-1);\neve.on(\"snap.util.getattr.#text\", function () {\n    return this.node.textContent;\n})(-1);\neve.on(\"snap.util.getattr.viewBox\", function () {\n    eve.stop();\n    var vb = $(this.node, \"viewBox\").split(separator);\n    return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n    // TODO: investigate why I need to z-index it\n})(-1);\neve.on(\"snap.util.getattr.points\", function () {\n    var p = $(this.node, \"points\");\n    eve.stop();\n    return p.split(separator);\n});\neve.on(\"snap.util.getattr.path\", function () {\n    var p = $(this.node, \"d\");\n    eve.stop();\n    return p;\n});\n// default\neve.on(\"snap.util.getattr\", function () {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    var css = att.replace(/[A-Z]/g, function (letter) {\n        return \"-\" + letter.toLowerCase();\n    });\n    if (cssAttr[has](css)) {\n        return glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n    } else {\n        return $(this.node, att);\n    }\n});\nvar getOffset = function (elem) {\n    var box = elem.getBoundingClientRect(),\n        doc = elem.ownerDocument,\n        body = doc.body,\n        docElem = doc.documentElement,\n        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n        top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n        left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n    return {\n        y: top,\n        x: left\n    };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n    var paper = this,\n        svg = paper.canvas,\n        target = glob.doc.elementFromPoint(x, y);\n    if (glob.win.opera && target.tagName == \"svg\") {\n        var so = getOffset(target),\n            sr = target.createSVGRect();\n        sr.x = x - so.x;\n        sr.y = y - so.y;\n        sr.width = sr.height = 1;\n        var hits = target.getIntersectionList(sr, null);\n        if (hits.length) {\n            target = hits[hits.length - 1];\n        }\n    }\n    if (!target) {\n        return null;\n    }\n    return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with four arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global) {\n |     Snap.newmethod = function () {};\n |     Element.prototype.newmethod = function () {};\n |     Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n    f(Snap, Element, Paper, glob);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}());\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        clone = Snap._.clone,\n        has = \"hasOwnProperty\",\n        p2s = /,?([a-z]),?/gi,\n        toFloat = parseFloat,\n        math = Math,\n        PI = math.PI,\n        mmin = math.min,\n        mmax = math.max,\n        pow = math.pow,\n        abs = math.abs;\n    function paths(ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    }\n    function box(x, y, width, height) {\n        if (x == null) {\n            x = y = width = height = 0;\n        }\n        if (y == null) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        return {\n            x: x,\n            y: y,\n            width: width,\n            w: width,\n            height: height,\n            h: height,\n            x2: x + width,\n            y2: y + height,\n            cx: x + width / 2,\n            cy: y + height / 2,\n            r1: math.min(width, height) / 2,\n            r2: math.max(width, height) / 2,\n            r0: math.sqrt(width * width + height * height) / 2,\n            path: rectPath(x, y, width, height),\n            vb: [x, y, width, height].join(\" \")\n        };\n    }\n    function toString() {\n        return this.join(\",\").replace(p2s, \"$1\");\n    }\n    function pathClone(pathArray) {\n        var res = clone(pathArray);\n        res.toString = toString;\n        return res;\n    }\n    function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n                getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    }\n    function getLengthFactory(istotal, subpath) {\n        function O(val) {\n            return +(+val).toFixed(3);\n        }\n        return Snap._.cacher(function (path, length, onlystart) {\n            if (path instanceof Element) {\n                path = path.attr(\"d\");\n            }\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\n                                \"C\" + O(point.start.x),\n                                O(point.start.y),\n                                O(point.m.x),\n                                O(point.m.y),\n                                O(point.x),\n                                O(point.y)\n                            ];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\n                                \"M\" + O(point.x),\n                                O(point.y) + \"C\" + O(point.n.x),\n                                O(point.n.y),\n                                O(point.end.x),\n                                O(point.end.y),\n                                O(p[5]),\n                                O(p[6])\n                            ].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return point;\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            return point;\n        }, null, Snap._.clone);\n    }\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\n        // (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    }\n    function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!Snap.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return box(\n            bbox.min.x,\n            bbox.min.y,\n            bbox.max.x - bbox.min.x,\n            bbox.max.y - bbox.min.y\n        );\n    }\n    function isPointInsideBBox(bbox, x, y) {\n        return  x >= bbox.x &&\n                x <= bbox.x + bbox.width &&\n                y >= bbox.y &&\n                y <= bbox.y + bbox.height;\n    }\n    function isBBoxIntersect(bbox1, bbox2) {\n        bbox1 = box(bbox1);\n        bbox2 = box(bbox2);\n        return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n                || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n                || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    }\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = bezierBBox(bez1),\n            bbox2 = bezierBBox(bez2);\n        if (!isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = ~~(l1 / 5),\n            n2 = ~~(l2 / 5),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: t1,\n                                t2: t2\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function pathIntersection(path1, path2) {\n        return interPathHelper(path1, path2);\n    }\n    function pathIntersectionNumber(path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    }\n    function interPathHelper(path1, path2, justCount) {\n        path1 = path2curve(path1);\n        path2 = path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function isPointInsidePath(path, x, y) {\n        var bbox = pathBBox(path);\n        return isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    }\n    function pathBBox(path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return box();\n        }\n        path = path2curve(path);\n        var x = 0, \n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X.concat(dim.min.x, dim.max.x);\n                Y = Y.concat(dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin.apply(0, X),\n            ymin = mmin.apply(0, Y),\n            xmax = mmax.apply(0, X),\n            ymax = mmax.apply(0, Y),\n            bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n        pth.bbox = clone(bb);\n        return bb;\n    }\n    function rectPath(x, y, w, h, r) {\n        if (r) {\n            return [\n                [\"M\", x + r, y],\n                [\"l\", w - r * 2, 0],\n                [\"a\", r, r, 0, 0, 1, r, r],\n                [\"l\", 0, h - r * 2],\n                [\"a\", r, r, 0, 0, 1, -r, r],\n                [\"l\", r * 2 - w, 0],\n                [\"a\", r, r, 0, 0, 1, -r, -r],\n                [\"l\", 0, r * 2 - h],\n                [\"a\", r, r, 0, 0, 1, r, -r],\n                [\"z\"]\n            ];\n        }\n        var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        res.toString = toString;\n        return res;\n    }\n    function ellipsePath(x, y, rx, ry, a) {\n        if (a == null && ry == null) {\n            ry = rx;\n        }\n        if (a != null) {\n            var rad = Math.PI / 180,\n                x1 = x + rx * Math.cos(-ry * rad),\n                x2 = x + rx * Math.cos(-a * rad),\n                y1 = y + rx * Math.sin(-ry * rad),\n                y2 = y + rx * Math.sin(-a * rad),\n                res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n        } else {\n            res = [\n                [\"M\", x, y],\n                [\"m\", 0, -ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n                [\"z\"]\n            ];\n        }\n        res.toString = toString;\n        return res;\n    }\n    var unit2px = Snap._unit2px,\n        getPath = {\n        path: function (el) {\n            return el.attr(\"path\");\n        },\n        circle: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.r);\n        },\n        ellipse: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.rx, attr.ry);\n        },\n        rect: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height, attr.rx, attr.ry);\n        },\n        image: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height);\n        },\n        text: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        g: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        symbol: function (el) {\n            var bbox = el.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        line: function (el) {\n            return \"M\" + [el.attr(\"x1\"), el.attr(\"y1\"), el.attr(\"x2\"), el.attr(\"y2\")];\n        },\n        polyline: function (el) {\n            return \"M\" + el.attr(\"points\");\n        },\n        polygon: function (el) {\n            return \"M\" + el.attr(\"points\") + \"z\";\n        },\n        svg: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        deflt: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        }\n    };\n    function pathToRelative(pathArray) {\n        var pth = paths(pathArray),\n            lowerCase = String.prototype.toLowerCase;\n        if (pth.rel) {\n            return pathClone(pth.rel);\n        }\n        if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0;\n        if (pathArray[0][0] == \"M\") {\n            x = pathArray[0][1];\n            y = pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res.push([\"M\", x, y]);\n        }\n        for (var i = start, ii = pathArray.length; i < ii; i++) {\n            var r = res[i] = [],\n                pa = pathArray[i];\n            if (pa[0] != lowerCase.call(pa[0])) {\n                r[0] = lowerCase.call(pa[0]);\n                switch (r[0]) {\n                    case \"a\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] - x).toFixed(3);\n                        r[7] = +(pa[7] - y).toFixed(3);\n                        break;\n                    case \"v\":\n                        r[1] = +(pa[1] - y).toFixed(3);\n                        break;\n                    case \"m\":\n                        mx = pa[1];\n                        my = pa[2];\n                    default:\n                        for (var j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\n                        }\n                }\n            } else {\n                r = res[i] = [];\n                if (pa[0] == \"m\") {\n                    mx = pa[1] + x;\n                    my = pa[2] + y;\n                }\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    res[i][k] = pa[k];\n                }\n            }\n            var len = res[i].length;\n            switch (res[i][0]) {\n                case \"z\":\n                    x = mx;\n                    y = my;\n                    break;\n                case \"h\":\n                    x += +res[i][len - 1];\n                    break;\n                case \"v\":\n                    y += +res[i][len - 1];\n                    break;\n                default:\n                    x += +res[i][len - 2];\n                    y += +res[i][len - 1];\n            }\n        }\n        res.toString = toString;\n        pth.rel = pathClone(res);\n        return res;\n    }\n    function pathToAbsolute(pathArray) {\n        var pth = paths(pathArray);\n        if (pth.abs) {\n            return pathClone(pth.abs);\n        }\n        if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        if (!pathArray || !pathArray.length) {\n            return [[\"M\", 0, 0]];\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0,\n            pa0;\n        if (pathArray[0][0] == \"M\") {\n            x = +pathArray[0][1];\n            y = +pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res[0] = [\"M\", x, y];\n        }\n        var crz = pathArray.length == 3 &&\n            pathArray[0][0] == \"M\" &&\n            pathArray[1][0].toUpperCase() == \"R\" &&\n            pathArray[2][0].toUpperCase() == \"Z\";\n        for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n            res.push(r = []);\n            pa = pathArray[i];\n            pa0 = pa[0];\n            if (pa0 != pa0.toUpperCase()) {\n                r[0] = pa0.toUpperCase();\n                switch (r[0]) {\n                    case \"A\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] + x);\n                        r[7] = +(pa[7] + y);\n                        break;\n                    case \"V\":\n                        r[1] = +pa[1] + y;\n                        break;\n                    case \"H\":\n                        r[1] = +pa[1] + x;\n                        break;\n                    case \"R\":\n                        var dots = [x, y].concat(pa.slice(1));\n                        for (var j = 2, jj = dots.length; j < jj; j++) {\n                            dots[j] = +dots[j] + x;\n                            dots[++j] = +dots[j] + y;\n                        }\n                        res.pop();\n                        res = res.concat(catmullRom2bezier(dots, crz));\n                        break;\n                    case \"O\":\n                        res.pop();\n                        dots = ellipsePath(x, y, pa[1], pa[2]);\n                        dots.push(dots[0]);\n                        res = res.concat(dots);\n                        break;\n                    case \"U\":\n                        res.pop();\n                        res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                        r = [\"U\"].concat(res[res.length - 1].slice(-2));\n                        break;\n                    case \"M\":\n                        mx = +pa[1] + x;\n                        my = +pa[2] + y;\n                    default:\n                        for (j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +pa[j] + ((j % 2) ? x : y);\n                        }\n                }\n            } else if (pa0 == \"R\") {\n                dots = [x, y].concat(pa.slice(1));\n                res.pop();\n                res = res.concat(catmullRom2bezier(dots, crz));\n                r = [\"R\"].concat(pa.slice(-2));\n            } else if (pa0 == \"O\") {\n                res.pop();\n                dots = ellipsePath(x, y, pa[1], pa[2]);\n                dots.push(dots[0]);\n                res = res.concat(dots);\n            } else if (pa0 == \"U\") {\n                res.pop();\n                res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                r = [\"U\"].concat(res[res.length - 1].slice(-2));\n            } else {\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    r[k] = pa[k];\n                }\n            }\n            pa0 = pa0.toUpperCase();\n            if (pa0 != \"O\") {\n                switch (r[0]) {\n                    case \"Z\":\n                        x = mx;\n                        y = my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n        }\n        res.toString = toString;\n        pth.abs = pathClone(res);\n        return res;\n    }\n    function l2c(x1, y1, x2, y2) {\n        return [x1, y1, x2, y2, x2, y2];\n    }\n    function q2c(x1, y1, ax, ay, x2, y2) {\n        var _13 = 1 / 3,\n            _23 = 2 / 3;\n        return [\n                _13 * x1 + _23 * ax,\n                _13 * y1 + _23 * ay,\n                _13 * x2 + _23 * ax,\n                _13 * y2 + _23 * ay,\n                x2,\n                y2\n            ];\n    }\n    function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n        // for more information of where this math came from visit:\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        var _120 = PI * 120 / 180,\n            rad = PI / 180 * (+angle || 0),\n            res = [],\n            xy,\n            rotate = Snap._.cacher(function (x, y, rad) {\n                var X = x * math.cos(rad) - y * math.sin(rad),\n                    Y = x * math.sin(rad) + y * math.cos(rad);\n                return {x: X, y: Y};\n            });\n        if (!recursive) {\n            xy = rotate(x1, y1, -rad);\n            x1 = xy.x;\n            y1 = xy.y;\n            xy = rotate(x2, y2, -rad);\n            x2 = xy.x;\n            y2 = xy.y;\n            var cos = math.cos(PI / 180 * angle),\n                sin = math.sin(PI / 180 * angle),\n                x = (x1 - x2) / 2,\n                y = (y1 - y2) / 2;\n            var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n            if (h > 1) {\n                h = math.sqrt(h);\n                rx = h * rx;\n                ry = h * ry;\n            }\n            var rx2 = rx * rx,\n                ry2 = ry * ry,\n                k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                    math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                cx = k * rx * y / ry + (x1 + x2) / 2,\n                cy = k * -ry * x / rx + (y1 + y2) / 2,\n                f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n            f1 = x1 < cx ? PI - f1 : f1;\n            f2 = x2 < cx ? PI - f2 : f2;\n            f1 < 0 && (f1 = PI * 2 + f1);\n            f2 < 0 && (f2 = PI * 2 + f2);\n            if (sweep_flag && f1 > f2) {\n                f1 = f1 - PI * 2;\n            }\n            if (!sweep_flag && f2 > f1) {\n                f2 = f2 - PI * 2;\n            }\n        } else {\n            f1 = recursive[0];\n            f2 = recursive[1];\n            cx = recursive[2];\n            cy = recursive[3];\n        }\n        var df = f2 - f1;\n        if (abs(df) > _120) {\n            var f2old = f2,\n                x2old = x2,\n                y2old = y2;\n            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n            x2 = cx + rx * math.cos(f2);\n            y2 = cy + ry * math.sin(f2);\n            res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n        }\n        df = f2 - f1;\n        var c1 = math.cos(f1),\n            s1 = math.sin(f1),\n            c2 = math.cos(f2),\n            s2 = math.sin(f2),\n            t = math.tan(df / 4),\n            hx = 4 / 3 * rx * t,\n            hy = 4 / 3 * ry * t,\n            m1 = [x1, y1],\n            m2 = [x1 + hx * s1, y1 - hy * c1],\n            m3 = [x2 + hx * s2, y2 - hy * c2],\n            m4 = [x2, y2];\n        m2[0] = 2 * m1[0] - m2[0];\n        m2[1] = 2 * m1[1] - m2[1];\n        if (recursive) {\n            return [m2, m3, m4].concat(res);\n        } else {\n            res = [m2, m3, m4].concat(res).join().split(\",\");\n            var newres = [];\n            for (var i = 0, ii = res.length; i < ii; i++) {\n                newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n            }\n            return newres;\n        }\n    }\n    function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t;\n        return {\n            x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n            y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n        };\n    }\n    function curveDim(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\n            b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\n            c = p1x - c1x,\n            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            y = [p1y, p2y],\n            x = [p1x, p2x],\n            dot;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\n        b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\n        c = p1y - c1y;\n        t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        return {\n            min: {x: mmin.apply(0, x), y: mmin.apply(0, y)},\n            max: {x: mmax.apply(0, x), y: mmax.apply(0, y)}\n        };\n    }\n    function path2curve(path, path2) {\n        var pth = !path2 && paths(path);\n        if (!path2 && pth.curve) {\n            return pathClone(pth.curve);\n        }\n        var p = pathToAbsolute(path),\n            p2 = path2 && pathToAbsolute(path2),\n            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            processPath = function (path, d) {\n                var nx, ny;\n                if (!path) {\n                    return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                }\n                !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);\n                switch (path[0]) {\n                    case \"M\":\n                        d.X = path[1];\n                        d.Y = path[2];\n                        break;\n                    case \"A\":\n                        path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n                        break;\n                    case \"S\":\n                        nx = d.x + (d.x - (d.bx || d.x));\n                        ny = d.y + (d.y - (d.by || d.y));\n                        path = [\"C\", nx, ny].concat(path.slice(1));\n                        break;\n                    case \"T\":\n                        d.qx = d.x + (d.x - (d.qx || d.x));\n                        d.qy = d.y + (d.y - (d.qy || d.y));\n                        path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                        break;\n                    case \"Q\":\n                        d.qx = path[1];\n                        d.qy = path[2];\n                        path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                        break;\n                    case \"L\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n                        break;\n                    case \"H\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n                        break;\n                    case \"V\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n                        break;\n                    case \"Z\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n                        break;\n                }\n                return path;\n            },\n            fixArc = function (pp, i) {\n                if (pp[i].length > 7) {\n                    pp[i].shift();\n                    var pi = pp[i];\n                    while (pi.length) {\n                        pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n                    }\n                    pp.splice(i, 1);\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            fixM = function (path1, path2, a1, a2, i) {\n                if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                    path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                    a1.bx = 0;\n                    a1.by = 0;\n                    a1.x = path1[i][1];\n                    a1.y = path1[i][2];\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            };\n        for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n            p[i] = processPath(p[i], attrs);\n            fixArc(p, i);\n            p2 && (p2[i] = processPath(p2[i], attrs2));\n            p2 && fixArc(p2, i);\n            fixM(p, p2, attrs, attrs2, i);\n            fixM(p2, p, attrs2, attrs, i);\n            var seg = p[i],\n                seg2 = p2 && p2[i],\n                seglen = seg.length,\n                seg2len = p2 && seg2.length;\n            attrs.x = seg[seglen - 2];\n            attrs.y = seg[seglen - 1];\n            attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n            attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n            attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n            attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n            attrs2.x = p2 && seg2[seg2len - 2];\n            attrs2.y = p2 && seg2[seg2len - 1];\n        }\n        if (!p2) {\n            pth.curve = pathClone(p);\n        }\n        return p2 ? [p, p2] : p;\n    }\n    function mapPath(path, matrix) {\n        if (!matrix) {\n            return path;\n        }\n        var x, y, i, j, ii, jj, pathi;\n        path = path2curve(path);\n        for (i = 0, ii = path.length; i < ii; i++) {\n            pathi = path[i];\n            for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                x = matrix.x(pathi[j], pathi[j + 1]);\n                y = matrix.y(pathi[j], pathi[j + 1]);\n                pathi[j] = x;\n                pathi[j + 1] = y;\n            }\n        }\n        return path;\n    }\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n\n    // export\n    Snap.path = paths;\n\n    /*\\\n     * Snap.path.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the given path in pixels\n     **\n     - path (string) SVG path string\n     **\n     = (number) length\n    \\*/\n    Snap.path.getTotalLength = getTotalLength;\n    /*\\\n     * Snap.path.getPointAtLength\n     [ method ]\n     **\n     * Returns the coordinates of the point located at the given length along the given path\n     **\n     - path (string) SVG path string\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    Snap.path.getPointAtLength = getPointAtLength;\n    /*\\\n     * Snap.path.getSubpath\n     [ method ]\n     **\n     * Returns the subpath of a given path between given start and end lengths\n     **\n     - path (string) SVG path string\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    Snap.path.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the path in pixels (only works for `path` elements)\n     = (number) length\n    \\*/\n    elproto.getTotalLength = function () {\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n    };\n    // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a <path> is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n     **\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        return getPointAtLength(this.attr(\"d\"), length);\n    };\n    // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n     **\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n    };\n    Snap._.box = box;\n    /*\\\n     * Snap.path.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds dot coordinates on the given cubic beziér curve at the given t\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point,\n     o     y: (number) y coordinate of the point,\n     o     m: {\n     o         x: (number) x coordinate of the left anchor,\n     o         y: (number) y coordinate of the left anchor\n     o     },\n     o     n: {\n     o         x: (number) x coordinate of the right anchor,\n     o         y: (number) y coordinate of the right anchor\n     o     },\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve,\n     o         y: (number) y coordinate of the start of the curve\n     o     },\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve,\n     o         y: (number) y coordinate of the end of the curve\n     o     },\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    Snap.path.findDotsAtSegment = findDotsAtSegment;\n    /*\\\n     * Snap.path.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given cubic beziér curve\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for beziér curve\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.bezierBBox = bezierBBox;\n    /*\\\n     * Snap.path.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding box\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point is inside\n    \\*/\n    Snap.path.isPointInsideBBox = isPointInsideBBox;\n    /*\\\n     * Snap.path.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if bounding boxes intersect\n    \\*/\n    Snap.path.isBBoxIntersect = isBBoxIntersect;\n    /*\\\n     * Snap.path.intersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point,\n     o         y: (number) y coordinate of the point,\n     o         t1: (number) t value for segment of path1,\n     o         t2: (number) t value for segment of path2,\n     o         segment1: (number) order number for segment of path1,\n     o         segment2: (number) order number for segment of path2,\n     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    Snap.path.intersection = pathIntersection;\n    Snap.path.intersectionNumber = pathIntersectionNumber;\n    /*\\\n     * Snap.path.isPointInside\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     *\n     * Note: fill mode doesn’t affect the result of this method.\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) `true` if point is inside the path\n    \\*/\n    Snap.path.isPointInside = isPointInsidePath;\n    /*\\\n     * Snap.path.getBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given path\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.getBBox = pathBBox;\n    Snap.path.get = getPath;\n    /*\\\n     * Snap.path.toRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into relative values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toRelative = pathToRelative;\n    /*\\\n     * Snap.path.toAbsolute\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into absolute values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toAbsolute = pathToAbsolute;\n    /*\\\n     * Snap.path.toCubic\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic beziér curves\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments\n    \\*/\n    Snap.path.toCubic = path2curve;\n    /*\\\n     * Snap.path.map\n     [ method ]\n     **\n     * Transform the path string with the given matrix\n     - path (string) path string\n     - matrix (object) see @Matrix\n     = (string) transformed path string\n    \\*/\n    Snap.path.map = mapPath;\n    Snap.path.toString = toString;\n    Snap.path.clone = pathClone;\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var mmax = Math.max,\n        mmin = Math.min;\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i]) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set\n     *\n     * If the function returns `false`, the loop stops running.\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    setproto.remove = function () {\n        while (this.length) {\n            this.pop().remove();\n        }\n        return this;\n    };\n    setproto.attr = function (value) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            this.items[i].attr(value);\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes range of elements from the set\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion… (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found and removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n        return false;\n    };\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin.apply(0, x);\n        y = mmin.apply(0, y);\n        x2 = mmax.apply(0, x2);\n        y2 = mmax.apply(0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y,\n            cx: x + (x2 - x) / 2,\n            cy: y + (y2 - y) / 2\n        };\n    };\n    setproto.clone = function (s) {\n        s = new Set;\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Snap\\u2018s set\";\n    };\n    setproto.type = \"set\";\n    // export\n    Snap.set = function () {\n        var set = new Set;\n        if (arguments.length) {\n            set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n        }\n        return set;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var names = {},\n        reUnit = /[a-z]+$/i,\n        Str = String;\n    names.stroke = names.fill = \"colour\";\n    function getEmpty(item) {\n        var l = item[0];\n        switch (l.toLowerCase()) {\n            case \"t\": return [l, 0, 0];\n            case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n            case \"r\": if (item.length == 4) {\n                return [l, 0, item[2], item[3]];\n            } else {\n                return [l, 0];\n            }\n            case \"s\": if (item.length == 5) {\n                return [l, 1, 1, item[3], item[4]];\n            } else if (item.length == 3) {\n                return [l, 1, 1];\n            } else {\n                return [l, 1];\n            }\n        }\n    }\n    function equaliseTransform(t1, t2, getBBox) {\n        t2 = Str(t2).replace(/\\.{3}|\\u2026/g, t1);\n        t1 = Snap.parseTransformString(t1) || [];\n        t2 = Snap.parseTransformString(t2) || [];\n        var maxlength = Math.max(t1.length, t2.length),\n            from = [],\n            to = [],\n            i = 0, j, jj,\n            tt1, tt2;\n        for (; i < maxlength; i++) {\n            tt1 = t1[i] || getEmpty(t2[i]);\n            tt2 = t2[i] || getEmpty(tt1);\n            if ((tt1[0] != tt2[0]) ||\n                (tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\n                (tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\n                ) {\n                    t1 = Snap._.transform2matrix(t1, getBBox());\n                    t2 = Snap._.transform2matrix(t2, getBBox());\n                    from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n                    to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n                    break;\n            }\n            from[i] = [];\n            to[i] = [];\n            for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n                j in tt1 && (from[i][j] = tt1[j]);\n                j in tt2 && (to[i][j] = tt2[j]);\n            }\n        }\n        return {\n            from: path2array(from),\n            to: path2array(to),\n            f: getPath(from)\n        };\n    }\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    function getColour(clr) {\n        return Snap.rgb(clr[0], clr[1], clr[2]);\n    }\n    function getPath(path) {\n        var k = 0, i, ii, j, jj, out, a, b = [];\n        for (i = 0, ii = path.length; i < ii; i++) {\n            out = \"[\";\n            a = ['\"' + path[i][0] + '\"'];\n            for (j = 1, jj = path[i].length; j < jj; j++) {\n                a[j] = \"val[\" + (k++) + \"]\";\n            }\n            out += a + \"]\";\n            b[i] = out;\n        }\n        return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n    }\n    function path2array(path) {\n        var out = [];\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            for (var j = 1, jj = path[i].length; j < jj; j++) {\n                out.push(path[i][j]);\n            }\n        }\n        return out;\n    }\n    Element.prototype.equal = function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this;\n        if (a == +a && b == +b) {\n            return {\n                from: +a,\n                to: +b,\n                f: getNumber\n            };\n        }\n        if (names[name] == \"colour\") {\n            A = Snap.color(a);\n            B = Snap.color(b);\n            return {\n                from: [A.r, A.g, A.b, A.opacity],\n                to: [B.r, B.g, B.b, B.opacity],\n                f: getColour\n            };\n        }\n        if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n            if (b instanceof Snap.Matrix) {\n                b = b.toTransformString();\n            }\n            if (!Snap._.rgTransform.test(b)) {\n                b = Snap._.svgTransform2string(b);\n            }\n            return equaliseTransform(a, b, function () {\n                return el.getBBox(1);\n            });\n        }\n        if (name == \"d\" || name == \"path\") {\n            A = Snap.path.toCubic(a, b);\n            return {\n                from: path2array(A[0]),\n                to: path2array(A[1]),\n                f: getPath(A[0])\n            };\n        }\n        if (name == \"points\") {\n            A = Str(a).split(\",\");\n            B = Str(b).split(\",\");\n            return {\n                from: A,\n                to: B,\n                f: function (val) { return val; }\n            };\n        }\n        var aUnit = a.match(reUnit),\n            bUnit = Str(b).match(reUnit);\n        if (aUnit && aUnit == bUnit) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getUnit(aUnit)\n            };\n        } else {\n            return {\n                from: this.asPX(name),\n                to: this.asPX(name, b),\n                f: getNumber\n            };\n        }\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n    has = \"hasOwnProperty\",\n    supportsTouch = \"createTouch\" in glob.doc,\n    events = [\n        \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n        \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n        \"touchcancel\"\n    ],\n    touchMap = {\n        mousedown: \"touchstart\",\n        mousemove: \"touchmove\",\n        mouseup: \"touchend\"\n    },\n    getScroll = function (xy) {\n        var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\";\n        return glob.doc.documentElement[name] || glob.doc.body[name];\n    },\n    preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    addEvent = (function () {\n        if (glob.doc.addEventListener) {\n            return function (obj, type, fn, element) {\n                var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n                    f = function (e) {\r\n                        var scrollY = getScroll(\"y\"),\n                            scrollX = getScroll(\"x\");\n                        if (supportsTouch && touchMap[has](type)) {\r\n                            for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\r\n                                if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\r\n                                    var olde = e;\n                                    e = e.targetTouches[i];\n                                    e.originalEvent = olde;\n                                    e.preventDefault = preventTouch;\n                                    e.stopPropagation = stopTouch;\n                                    break;\r\n                                }\r\n                            }\r\n                        }\n                        var x = e.clientX + scrollX,\n                            y = e.clientY + scrollY;\n                        return fn.call(element, e, x, y);\r\n                    };\n\n                if (type !== realName) {\r\n                    obj.addEventListener(type, f, false);\r\n                }\n\n                obj.addEventListener(realName, f, false);\n\n                return function () {\n                    if (type !== realName) {\r\n                        obj.removeEventListener(type, f, false);\r\n                    }\n\n                    obj.removeEventListener(realName, f, false);\n                    return true;\n                };\n            };\n        } else if (glob.doc.attachEvent) {\n            return function (obj, type, fn, element) {\n                var f = function (e) {\n                    e = e || glob.win.event;\n                    var scrollY = getScroll(\"y\"),\n                        scrollX = getScroll(\"x\"),\n                        x = e.clientX + scrollX,\n                        y = e.clientY + scrollY;\n                    e.preventDefault = e.preventDefault || preventDefault;\n                    e.stopPropagation = e.stopPropagation || stopPropagation;\n                    return fn.call(element, e, x, y);\n                };\n                obj.attachEvent(\"on\" + type, f);\n                var detacher = function () {\n                    obj.detachEvent(\"on\" + type, f);\n                    return true;\n                };\n                return detacher;\n            };\n        }\n    })(),\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = getScroll(\"y\"),\n            scrollX = getScroll(\"x\"),\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch) {\n                var i = e.touches && e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                glob = Snap._.glob,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            // glob.win.opera && parent.removeChild(node);\n            // node.style.display = \"none\";\n            // o = dragi.el.paper.getElementByPoint(x, y);\n            // node.style.display = display;\n            // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        Snap.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n        }\n        drag = [];\n    };\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds a click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes a click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds a double click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes a double click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds a mousedown event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes a mousedown event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds a mousemove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes a mousemove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds a mouseout event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes a mouseout event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds a mouseover event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes a mouseover event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds a mouseup event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes a mouseup event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds a touchstart event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes a touchstart event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds a touchmove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes a touchmove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds a touchend event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes a touchend event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds a touchcancel event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes a touchcancel event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            Snap[eventName] = elproto[eventName] = function (fn, scope) {\n                if (Snap.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({\n                        name: eventName,\n                        f: fn,\n                        unbind: addEvent(this.shape || this.node || glob.doc, eventName, fn, scope || this)\n                    });\n                }\n                return this;\n            };\n            Snap[\"un\" + eventName] =\n            elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--) if (events[l].name == eventName &&\n                               (events[l].f == fn || !fn)) {\n                    events[l].unbind();\n                    events.splice(l, 1);\n                    !events.length && delete this.events;\n                    return this;\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds hover event handlers to the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes hover event handlers from the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n    // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n    // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n    // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start.<id> on start, drag.end.<id> on end and drag.move.<id> on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for an element's drag gesture\n     **\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionaly following `drag` events are triggered: `drag.start.<id>` on start, \n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element is dragged over another element \n     * `drag.over.<id>` fires as well.\n     *\n     * Start event and start handler are called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler are called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler are called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        if (!arguments.length) {\n            var origTransform;\n            return this.drag(function (dx, dy) {\n                this.attr({\n                    transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n                });\n            }, function () {\n                origTransform = this.transform().local;\n            });\n        }\n        function start(e, x, y) {\n            (e.originalEvent || e).preventDefault();\n            this._drag.x = x;\n            this._drag.y = y;\n            this._drag.id = e.identifier;\n            !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"snap.drag.start.\" + this.id, onstart);\n            onmove && eve.on(\"snap.drag.move.\" + this.id, onmove);\n            onend && eve.on(\"snap.drag.end.\" + this.id, onend);\n            eve(\"snap.drag.start.\" + this.id, start_scope || move_scope || this, x, y, e);\n        }\n        this._drag = {};\n        draggable.push({el: this, start: start});\n        this.mousedown(start);\n        return this;\n    };\n    /*\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut to assign event handler for `drag.over.<id>` event, where `id` is the element's `id` (see @Element.id)\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    // elproto.onDragOver = function (f) {\n    //     f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n    // };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from the given element\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].start);\n            draggable.splice(i, 1);\n            eve.unbind(\"snap.drag.*.\" + this.id);\n        }\n        !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n        return this;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        pproto = Paper.prototype,\n        rgurl = /^\\s*url\\((.+)\\)/,\n        Str = String,\n        $ = Snap._.$;\n    Snap.filter = {};\n// SIERRA Paper.filter(): I don't understand the note. Does that mean an HTML should dedicate a separate SVG region for a filter definition? What's the advantage over a DEFS?\n    /*\\\n     * Paper.filter\n     [ method ]\n     **\n     * Creates a `<filter>` element\n     **\n     - filstr (string) SVG fragment of filter provided as a string\n     = (object) @Element\n     * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n     > Usage\n     | var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    pproto.filter = function (filstr) {\n        var paper = this;\n        if (paper.type != \"svg\") {\n            paper = paper.paper;\n        }\n        var f = Snap.parse(Str(filstr)),\n            id = Snap._.id(),\n            width = paper.node.offsetWidth,\n            height = paper.node.offsetHeight,\n            filter = $(\"filter\");\n        $(filter, {\n            id: id,\n            filterUnits: \"userSpaceOnUse\"\n        });\n        filter.appendChild(f.node);\n        paper.defs.appendChild(filter);\n        return new Element(filter);\n    };\n    \n    eve.on(\"snap.util.getattr.filter\", function () {\n        eve.stop();\n        var p = $(this.node, \"filter\");\n        if (p) {\n            var match = Str(p).match(rgurl);\n            return match && Snap.select(match[1]);\n        }\n    });\n    eve.on(\"snap.util.attr.filter\", function (value) {\n        if (value instanceof Element && value.type == \"filter\") {\n            eve.stop();\n            var id = value.node.id;\n            if (!id) {\n                $(value.node, {id: value.id});\n                id = value.id;\n            }\n            $(this.node, {\n                filter: Snap.url(id)\n            });\n        }\n        if (!value || value == \"none\") {\n            eve.stop();\n            this.node.removeAttribute(\"filter\");\n        }\n    });\n    /*\\\n     * Snap.filter.blur\n     [ method ]\n     **\n     * Returns an SVG markup string for the blur filter\n     **\n     - x (number) amount of horizontal blur, in pixels\n     - y (number) #optional amount of vertical blur, in pixels\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.blur(5, 10)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.blur = function (x, y) {\n        if (x == null) {\n            x = 2;\n        }\n        var def = y == null ? x : [x, y];\n        return Snap.format('\\<feGaussianBlur stdDeviation=\"{def}\"/>', {\n            def: def\n        });\n    };\n    Snap.filter.blur.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.shadow\n     [ method ]\n     **\n     * Returns an SVG markup string for the shadow filter\n     **\n     - dx (number) horizontal shift of the shadow, in pixels\n     - dy (number) vertical shift of the shadow, in pixels\n     - blur (number) #optional amount of blur\n     - color (string) #optional color of the shadow\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.shadow(0, 2, 3)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.shadow = function (dx, dy, blur, color) {\n        color = color || \"#000\";\n        if (blur == null) {\n            blur = 4;\n        }\n        if (typeof blur == \"string\") {\n            color = blur;\n            blur = 4;\n        }\n        if (dx == null) {\n            dx = 0;\n            dy = 2;\n        }\n        if (dy == null) {\n            dy = dx;\n        }\n        color = Snap.color(color);\n        return Snap.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>', {\n            color: color,\n            dx: dx,\n            dy: dy,\n            blur: blur\n        });\n    };\n    Snap.filter.shadow.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.grayscale\n     [ method ]\n     **\n     * Returns an SVG markup string for the grayscale filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.grayscale = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>', {\n            a: 0.2126 + 0.7874 * (1 - amount),\n            b: 0.7152 - 0.7152 * (1 - amount),\n            c: 0.0722 - 0.0722 * (1 - amount),\n            d: 0.2126 - 0.2126 * (1 - amount),\n            e: 0.7152 + 0.2848 * (1 - amount),\n            f: 0.0722 - 0.0722 * (1 - amount),\n            g: 0.2126 - 0.2126 * (1 - amount),\n            h: 0.0722 + 0.9278 * (1 - amount)\n        });\n    };\n    Snap.filter.grayscale.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.sepia\n     [ method ]\n     **\n     * Returns an SVG markup string for the sepia filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.sepia = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>', {\n            a: 0.393 + 0.607 * (1 - amount),\n            b: 0.769 - 0.769 * (1 - amount),\n            c: 0.189 - 0.189 * (1 - amount),\n            d: 0.349 - 0.349 * (1 - amount),\n            e: 0.686 + 0.314 * (1 - amount),\n            f: 0.168 - 0.168 * (1 - amount),\n            g: 0.272 - 0.272 * (1 - amount),\n            h: 0.534 - 0.534 * (1 - amount),\n            i: 0.131 + 0.869 * (1 - amount)\n        });\n    };\n    Snap.filter.sepia.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.saturate\n     [ method ]\n     **\n     * Returns an SVG markup string for the saturate filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.saturate = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>', {\n            amount: 1 - amount\n        });\n    };\n    Snap.filter.saturate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.hueRotate\n     [ method ]\n     **\n     * Returns an SVG markup string for the hue-rotate filter\n     **\n     - angle (number) angle of rotation\n     = (string) filter representation\n    \\*/\n    Snap.filter.hueRotate = function (angle) {\n        angle = angle || 0;\n        return Snap.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>', {\n            angle: angle\n        });\n    };\n    Snap.filter.hueRotate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.invert\n     [ method ]\n     **\n     * Returns an SVG markup string for the invert filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.invert = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: 1 - amount\n        });\n    };\n    Snap.filter.invert.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.brightness\n     [ method ]\n     **\n     * Returns an SVG markup string for the brightness filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.brightness = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>', {\n            amount: amount\n        });\n    };\n    Snap.filter.brightness.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.contrast\n     [ method ]\n     **\n     * Returns an SVG markup string for the contrast filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.contrast = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: .5 - amount / 2\n        });\n    };\n    Snap.filter.contrast.toString = function () {\n        return this();\n    };\n});\nreturn Snap;\n}));\ndefine('app/heart',['require'],function (require) {\n\t\n\tvar Heart = function (s, x, y) {\n\t\tvar instance = this,\n\t\t\theart,\n\t\t\theartMatrix,\n\t\t\ttotalMaskVertices = 50;\n\t\t\n\t\tthis.el = s.select(\"#heart\");\n\t\theart = this.el.select('#heart-shape');\n\t\t\n\t\tinstance.maskElement = s.path(getPath(totalMaskVertices));\t\t\n\t\tinstance.el.attr({\n\t\t\tclipPath: instance.maskElement\n\t\t});\n\t\t\n\t\tthis.animFill = function (f, dur) {\n\t\t\theart.animate({\n\t\t\t\tfill: f\n\t\t\t}, 200);\n\t\t}\n\t\t\n\t\tthis.setFill = function (f, dur) {\n\t\t\theart.attr({\n\t\t\t\tfill: f\n\t\t\t}, 200);\n\t\t}\n\t\t\n\t\tthis.animScale = function (scale, dur) {\n\t\t\tdur = dur ? dur : 300;\n\t\t\t\n\t\t\tthis.matrix = new Snap.Matrix();\n\t\t\tthis.matrix.translate(x, y);\n\t\t\tthis.matrix.scale(scale);\n\t\t\tthis.el.animate({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t}, dur, mina.bounce);\n\t\t}\n\t\t\n\t\tthis.setScale = function (scale, dur) {\n\t\t\tdur = dur ? dur : 300;\n\t\t\t\n\t\t\tthis.matrix = new Snap.Matrix();\n\t\t\tthis.matrix.translate(x, y);\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.attr({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t});\n\t\t\t\n\t\t}\n\t\t\n\t\tthis.mask = function () {\n\t\t\tvar n = totalMaskVertices;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\td: getPath(n)\n\t\t\t});\n\t\t\t\n\t\t\tfunction updatePath() {\n\t\t\t\tn -= 1;\n\t\t\t\tinstance.maskElement.attr({\n\t\t\t\t\td: getPath(n)\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif (n > 0) {\n\t\t\t\t\tsetTimeout(updatePath, 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tsetTimeout(updatePath, 10);\n\t\t}\n\t\t\n\t\tthis.unmask = function () {\n\t\t\tinstance.maskElement.attr({\n\t\t\t\td: getPath(totalMaskVertices)\n\t\t\t});\n\t\t}\n\t\t\n\t\tfunction getPath(n) {\n\t\t\tvar pathString,\n\t\t\t\ti,\n\t\t\t\t_x,\n\t\t\t\t_y;\n\t\t\t\n\t\t\tpathString = \"M0 0\";\n\t\t\t\n\t\t\tfor (i = 0; i < n + 1; i += 1) {\n\t\t\t\ta = 2 * Math.PI * i / totalMaskVertices;\n                a += Math.PI;\n\n\t\t\t\t_x = Math.sin(a) * 50;\n\t\t\t\t_y = Math.cos(a) * 50;\n\t\t\t\t\n\t\t\t\tpathString += \"L\" + _x + \" \" + _y;\n\t\t\t}\n\t\t\t\n\t\t\tpathString += \"Z\";\n\t\t\treturn pathString;\n\t\t}\n\t}\n\t\n\treturn Heart;\n});\ndefine('app/device',['require'],function (require) {\n\t\n\tvar Device = function (s, x, y) {\n\t\tvar instance = this;\n\t\t\n\t\tthis.el = s.g();\n\t\tthis.matrix = new Snap.Matrix();\n\t\tthis.matrix.translate(x, y);\n\t\tthis.el.transform(this.matrix.toTransformString());\n\t\t\n\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\tthis.keyboardMatrix.translate(0, 70);\n\t\t\n\t\tinstance.maskElement = s.polygon();\n\t\tinstance.maskElement.toDefs();\n\t\t\n\t\taddBack();\n\t\taddScreen();\n\t\t//addGloss();\n\t\taddKeyboard();\n\t\t\n\t\tfunction addBack() {\n\t\t\tinstance.back = s.rect(0, 0, 0, 0);\n\t\t\tinstance.back.attr({\n\t\t\t\tfill: '#696969'\n\t\t\t});\n\n\t\t\tinstance.el.append(instance.back);\t\n\t\t}\n\t\t\n\t\tfunction addScreen() {\n\t\t\tinstance.scr = s.rect(0, 0, 0, 0);\n\t\t\tinstance.scr.attr({\n\t\t\t\tfill: \"#09ae8a\"\n\t\t\t});\n\n\t\t\tinstance.el.append(instance.scr);\n\t\t}\n\t\t\n\t\tfunction addKeyboard() {\n\t\t\tvar p1,\n\t\t\t\tp2;\n\t\t\t\t\n\t\t\tinstance.keyboard = s.g();\n\t\t\tinstance.keyboard.transform(instance.keyboardMatrix.toTransformString());\n\t\t\t\n\t\t\tp1 = s.polygon('-103.324,0 -135.324,32 136.676,32 104.676,0 ');\n\t\t\tp1.attr({\n\t\t\t\tfill: '#818181'\n\t\t\t});\n\t\t\t\n\t\t\tp2 = s.polygon('127.774,40 -128.226,40 -136.226,32 135.774,32 ');\n\t\t\tp2.attr({\n\t\t\t\tfill: '#676767'\n\t\t\t});\n\t\t\t\n\t\t\tinstance.keyboard.append(p1);\n\t\t\tinstance.keyboard.append(p2);\n\t\t\tinstance.el.append(instance.keyboard);\n\t\t}\n\t\t\n\t\tfunction addGloss() {\n\t\t\tinstance.gl = s.rect(0, 0, 0, 0);\n\t\t\tinstance.gl.attr({\n\t\t\t\topacity: 0.2,\n\t\t\t\tfill: \"white\",\n\t\t\t\tclipPath: instance.maskElement\n\t\t\t});\n\t\t\t\n\t\t\tinstance.el.append(instance.gl);\n\t\t}\n\t\t\n\t\tthis.hideKeyboard = function () {\n\t\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\t\tinstance.keyboardMatrix.translate(0, 50);\n\t\t\tinstance.keyboardMatrix.scale(0.01, 0.01, 0, 0);\n\t\t\tinstance.keyboard.animate({\n\t\t\t\topacity: 0,\n\t\t\t\ttransform: instance.keyboardMatrix.toTransformString()\n\t\t\t}, 100);\n\t\t}\n\t\t\n\t\tthis.showKeyboard = function () {\n\t\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\t\tinstance.keyboardMatrix.translate(0, 70);\n\t\t\tinstance.keyboardMatrix.scale(1, 1, 0, 0);\n\t\t\tinstance.keyboard.attr({\n\t\t\t\topacity: 1,\n\t\t\t\ttransform: instance.keyboardMatrix.toTransformString()\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.setScreen = function(w, h) {\n\t\t\tthis.scr.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.setBack = function (w, h) {\n\t\t\tthis.back.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t\t\n\t\t\t/*\n\t\t\tthis.gl.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t\t\n\t\t\tvar pointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\tpoints: pointString\n\t\t\t});\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.setScale = function (scale) {\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.transform(this.matrix.toTransformString());\n\t\t}\n\t\t\n\t\tthis.animScreen = function(w, h) {\n\t\t\tthis.scr.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t}\n\t\t\n\t\tthis.animBack = function (w, h) {\n\t\t\tthis.back.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t\t\n\t\t\t/*\n\t\t\tthis.gl.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t\t\n\t\t\tvar pointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\tpoints: pointString\n\t\t\t});\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.animRotation = function (r) {\n\t\t\tinstance.matrix.rotate(r, 0, 0);\n\t\t\t\t\t\n\t\t\tinstance.el.animate({\n\t\t\t\ttransform: instance.matrix.toTransformString()\n\t\t\t}, 100, mina.easeIn);\n\t\t\t\n\t\t\t/*\n\t\t\tif (r == 90) {\n\t\t\t\tvar w = 100,\n\t\t\t\t\th = 56,\n\t\t\t\t\tpointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\t\n\t\t\t\tinstance.maskElement.attr({\n\t\t\t\t\tpoints: pointString\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tinstance.maskElement.animate({\n\t\t\t\t\ttransform: 'rotate(-90)'\n\t\t\t\t}, 100, mina.easeIn);\n\t\t\t} else {\n\t\t\t\tinstance.maskElement.animate({\n\t\t\t\t\ttransform: 'rotate(0)'\n\t\t\t\t}, 100, mina.easeIn);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.animScale = function (scale, dur, ease) {\n\t\t\tdur = dur ? dur : 100;\n\t\t\tease = ease ? ease : mina.easeout;\n\t\t\t\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.animate({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t}, dur, ease);\n\t\t}\n\t\t\n\t\tthis.animOpacity = function (opacity, dur) {\n\t\t\tdur = dur ? dur : 200;\n\t\t\t\n\t\t\tthis.el.animate({\n\t\t\t\topacity: opacity\n\t\t\t}, dur);\n\t\t}\n\t\t\n\t\tthis.setOpacity = function (opacity) {\t\t\t\n\t\t\tthis.el.attr({\n\t\t\t\topacity: opacity\n\t\t\t});\n\t\t}\n\t}\n\t\n\treturn Device;\n});\ndefine('app/burst',['require'],function (require) {\n\t\n\tvar Burst = function (s, x, y) {\n\t\tvar instance = this,\n\t\t\tpolygons,\n\t\t\tmask,\n\t\t\tmaskCircle,\n\t\t\tmaskBg;\n\t\t\n\t\tthis.el = s.select(\"#burst\");\n\t\t\n\t\tmask = s.g();\n\t\tmask.toDefs();\n\t\t\n\t\tmaskBg = s.rect(-200, -200, 400, 400);\n\t\tmaskBg.attr({\n\t\t\tfill: 'white'\n\t\t});\n\t\tmask.append(maskBg);\n\t\t\n\t\tmaskCircle = s.circle(0, 0, 30);\n\t\tmask.append(maskCircle);\n\t\t\n\t\tthis.el.attr({\n\t\t\tmask: mask\n\t\t});\n\t\t\n\t\tthis.anim = function () {\n\t\t\tthis.el.animate({\n\t\t\t\topacity: 1\n\t\t\t}, 100);\n\t\t\t\n\t\t\tmaskCircle.animate({\n\t\t\t\ttransform: 'scale(6)'\n\t\t\t}, 300);\n\t\t\t\n\t\t\tsetTimeout(function () {\n\t\t\t\tinstance.el.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 100);\n\t\t\t}, 300)\n\t\t}\n\t\t\n\t\tthis.reset = function () {\n\t\t\tmaskCircle.attr({\n\t\t\t\ttransform: 'scale(1)'\n\t\t\t});\n\t\t}\n\t}\n\t\n\treturn Burst;\n});\n//============================================================\n//\n// Copyright (C) 2013 Matthew Wagerfield\n//\n// Twitter: https://twitter.com/mwagerfield\n//\n// Permission is hereby granted, free of charge, to any\n// person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the\n// Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do\n// so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice\n// shall be included in all copies or substantial portions\n// of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY\n// OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n// EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n// OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//============================================================\n\n/**\n * Defines the Flat Surface Shader namespace for all the awesomeness to exist upon.\n * @author Matthew Wagerfield\n */\nFSS = {\n  FRONT  : 0,\n  BACK   : 1,\n  DOUBLE : 2,\n  SVGNS  : 'http://www.w3.org/2000/svg'\n};\n\n/**\n * @class Array\n * @author Matthew Wagerfield\n */\nFSS.Array = typeof Float32Array === 'function' ? Float32Array : Array;\n\n/**\n * @class Utils\n * @author Matthew Wagerfield\n */\nFSS.Utils = {\n  isNumber: function(value) {\n    return !isNaN(parseFloat(value)) && isFinite(value);\n  }\n};\n\n/**\n * Request Animation Frame Polyfill.\n * @author Paul Irish\n * @see https://gist.github.com/paulirish/1579671\n */\n(function() {\n\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n    window.cancelAnimationFrame  = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = function(callback, element) {\n      var currentTime = new Date().getTime();\n      var timeToCall = Math.max(0, 16 - (currentTime - lastTime));\n      var id = window.setTimeout(function() {\n        callback(currentTime + timeToCall);\n      }, timeToCall);\n      lastTime = currentTime + timeToCall;\n      return id;\n    };\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = function(id) {\n      clearTimeout(id);\n    };\n  }\n\n}());\n\n/**\n * @object Math Augmentation\n * @author Matthew Wagerfield\n */\nMath.PIM2 = Math.PI*2;\nMath.PID2 = Math.PI/2;\nMath.randomInRange = function(min, max) {\n  return min + (max - min) * Math.random();\n};\nMath.clamp = function(value, min, max) {\n  value = Math.max(value, min);\n  value = Math.min(value, max);\n  return value;\n};\n\n/**\n * @object Vector3\n * @author Matthew Wagerfield\n */\nFSS.Vector3 = {\n  create: function(x, y, z) {\n    var vector = new FSS.Array(3);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  clone: function(a) {\n    var vector = this.create();\n    this.copy(vector, a);\n    return vector;\n  },\n  set: function(target, x, y, z) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  copy: function(target, a) {\n    target[0] = a[0];\n    target[1] = a[1];\n    target[2] = a[2];\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    return this;\n  },\n  addVectors: function(target, a, b) {\n    target[0] = a[0] + b[0];\n    target[1] = a[1] + b[1];\n    target[2] = a[2] + b[2];\n    return this;\n  },\n  addScalar: function(target, s) {\n    target[0] += s;\n    target[1] += s;\n    target[2] += s;\n    return this;\n  },\n  subtract: function(target, a) {\n    target[0] -= a[0];\n    target[1] -= a[1];\n    target[2] -= a[2];\n    return this;\n  },\n  subtractVectors: function(target, a, b) {\n    target[0] = a[0] - b[0];\n    target[1] = a[1] - b[1];\n    target[2] = a[2] - b[2];\n    return this;\n  },\n  subtractScalar: function(target, s) {\n    target[0] -= s;\n    target[1] -= s;\n    target[2] -= s;\n    return this;\n  },\n  multiply: function(target, a) {\n    target[0] *= a[0];\n    target[1] *= a[1];\n    target[2] *= a[2];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    return this;\n  },\n  divide: function(target, a) {\n    target[0] /= a[0];\n    target[1] /= a[1];\n    target[2] /= a[2];\n    return this;\n  },\n  divideVectors: function(target, a, b) {\n    target[0] = a[0] / b[0];\n    target[1] = a[1] / b[1];\n    target[2] = a[2] / b[2];\n    return this;\n  },\n  divideScalar: function(target, s) {\n    if (s !== 0) {\n      target[0] /= s;\n      target[1] /= s;\n      target[2] /= s;\n    } else {\n      target[0] = 0;\n      target[1] = 0;\n      target[2] = 0;\n    }\n    return this;\n  },\n  cross: function(target, a) {\n    var x = target[0];\n    var y = target[1];\n    var z = target[2];\n    target[0] = y*a[2] - z*a[1];\n    target[1] = z*a[0] - x*a[2];\n    target[2] = x*a[1] - y*a[0];\n    return this;\n  },\n  crossVectors: function(target, a, b) {\n    target[0] = a[1]*b[2] - a[2]*b[1];\n    target[1] = a[2]*b[0] - a[0]*b[2];\n    target[2] = a[0]*b[1] - a[1]*b[0];\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  },\n  limit: function(target, min, max) {\n    var length = this.length(target);\n    if (min !== null && length < min) {\n      this.setLength(target, min);\n    } else if (max !== null && length > max) {\n      this.setLength(target, max);\n    }\n    return this;\n  },\n  dot: function(a, b) {\n    return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n  },\n  normalise: function(target) {\n    return this.divideScalar(target, this.length(target));\n  },\n  negate: function(target) {\n    return this.multiplyScalar(target, -1);\n  },\n  distanceSquared: function(a, b) {\n    var dx = a[0] - b[0];\n    var dy = a[1] - b[1];\n    var dz = a[2] - b[2];\n    return dx*dx + dy*dy + dz*dz;\n  },\n  distance: function(a, b) {\n    return Math.sqrt(this.distanceSquared(a, b));\n  },\n  lengthSquared: function(a) {\n    return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];\n  },\n  length: function(a) {\n    return Math.sqrt(this.lengthSquared(a));\n  },\n  setLength: function(target, l) {\n    var length = this.length(target);\n    if (length !== 0 && l !== length) {\n      this.multiplyScalar(target, l / length);\n    }\n    return this;\n  }\n};\n\n/**\n * @object Vector4\n * @author Matthew Wagerfield\n */\nFSS.Vector4 = {\n  create: function(x, y, z, w) {\n    var vector = new FSS.Array(4);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  set: function(target, x, y, z, w) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    target[3] = w || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  setW: function(target, w) {\n    target[3] = w || 0;\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    target[3] += a[3];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    target[3] = a[3] * b[3];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    target[3] *= s;\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    if (target[3] < value) { target[3] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    if (target[3] > value) { target[3] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  }\n};\n\n/**\n * @class Color\n * @author Matthew Wagerfield\n */\nFSS.Color = function(hex, opacity) {\n  this.rgba = FSS.Vector4.create();\n  this.hex = hex || '#000000';\n  this.opacity = FSS.Utils.isNumber(opacity) ? opacity : 1;\n  this.set(this.hex, this.opacity);\n};\n\nFSS.Color.prototype = {\n  set: function(hex, opacity) {\n    hex = hex.replace('#', '');\n    var size = hex.length / 3;\n    this.rgba[0] = parseInt(hex.substring(size*0, size*1), 16) / 255;\n    this.rgba[1] = parseInt(hex.substring(size*1, size*2), 16) / 255;\n    this.rgba[2] = parseInt(hex.substring(size*2, size*3), 16) / 255;\n    this.rgba[3] = FSS.Utils.isNumber(opacity) ? opacity : this.rgba[3];\n    return this;\n  },\n  hexify: function(channel) {\n    var hex = Math.ceil(channel*255).toString(16);\n    if (hex.length === 1) { hex = '0' + hex; }\n    return hex;\n  },\n  format: function() {\n    var r = this.hexify(this.rgba[0]);\n    var g = this.hexify(this.rgba[1]);\n    var b = this.hexify(this.rgba[2]);\n    this.hex = '#' + r + g + b;\n    return this.hex;\n  }\n};\n\n/**\n * @class Object\n * @author Matthew Wagerfield\n */\nFSS.Object = function() {\n  this.position = FSS.Vector3.create();\n};\n\nFSS.Object.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n\n/**\n * @class Light\n * @author Matthew Wagerfield\n */\nFSS.Light = function(ambient, diffuse) {\n  FSS.Object.call(this);\n  this.ambient = new FSS.Color(ambient || '#FFFFFF');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.ray = FSS.Vector3.create();\n};\n\nFSS.Light.prototype = Object.create(FSS.Object.prototype);\n\n/**\n * @class Vertex\n * @author Matthew Wagerfield\n */\nFSS.Vertex = function(x, y, z) {\n  this.position = FSS.Vector3.create(x, y, z);\n};\n\nFSS.Vertex.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n\n/**\n * @class Triangle\n * @author Matthew Wagerfield\n */\nFSS.Triangle = function(a, b, c, s, material) {\n  this.a = a || new FSS.Vertex();\n  this.b = b || new FSS.Vertex();\n  this.c = c || new FSS.Vertex();\n  this.vertices = [this.a, this.b, this.c];\n  this.u = FSS.Vector3.create();\n  this.v = FSS.Vector3.create();\n  this.centroid = FSS.Vector3.create();\n  this.normal = FSS.Vector3.create();\n  this.material = material || new FSS.Material();\n  this.color = new FSS.Color();\n  this.polygon = s.polygon();\n  this.polygon.attr({\n    'stroke-linejoin': 'round',\n\t'stroke-miterlimit': 1,\n\t'stroke-width': 1\n  });\n\n  this.computeCentroid();\n  this.computeNormal();\n};\n\nFSS.Triangle.prototype = {\n  computeCentroid: function() {\n    this.centroid[0] = this.a.position[0] + this.b.position[0] + this.c.position[0];\n    this.centroid[1] = this.a.position[1] + this.b.position[1] + this.c.position[1];\n    this.centroid[2] = this.a.position[2] + this.b.position[2] + this.c.position[2];\n    FSS.Vector3.divideScalar(this.centroid, 3);\n    return this;\n  },\n  computeNormal: function() {\n    FSS.Vector3.subtractVectors(this.u, this.b.position, this.a.position);\n    FSS.Vector3.subtractVectors(this.v, this.c.position, this.a.position);\n    FSS.Vector3.crossVectors(this.normal, this.u, this.v);\n    FSS.Vector3.normalise(this.normal);\n    return this;\n  }\n};\n\n/**\n * @class Geometry\n * @author Matthew Wagerfield\n */\nFSS.Geometry = function() {\n  this.vertices = [];\n  this.triangles = [];\n  this.dirty = false;\n};\n\nFSS.Geometry.prototype = {\n  update: function() {\n    if (this.dirty) {\n      var t,triangle;\n      for (t = this.triangles.length - 1; t >= 0; t--) {\n        triangle = this.triangles[t];\n        triangle.computeCentroid();\n        triangle.computeNormal();\n      }\n      this.dirty = false;\n    }\n    return this;\n  }\n};\n\n/**\n * @class Plane\n * @author Matthew Wagerfield\n */\nFSS.Plane = function(width, height, segments, slices, s, material) {\n  FSS.Geometry.call(this);\n  this.width = width || 100;\n  this.height = height || 100;\n  this.segments = segments || 4;\n  this.slices = slices || 4;\n  this.segmentWidth = this.width / this.segments;\n  this.sliceHeight = this.height / this.slices;\n\n  // Cache Variables\n  var x, y, v0, v1, v2, v3,\n      vertex, triangle, vertices = [],\n      offsetX = this.width * -0.5,\n      offsetY = this.height * 0.5;\n\n  // Add Vertices\n  for (x = 0; x <= this.segments; x++) {\n    vertices.push([]);\n    for (y = 0; y <= this.slices; y++) {\n      vertex = new FSS.Vertex(offsetX + x*this.segmentWidth, offsetY - y*this.sliceHeight);\n      vertices[x].push(vertex);\n      this.vertices.push(vertex);\n    }\n  }\n\n  // Add Triangles\n  for (x = 0; x < this.segments; x++) {\n    for (y = 0; y < this.slices; y++) {\n      v0 = vertices[x+0][y+0];\n      v1 = vertices[x+0][y+1];\n      v2 = vertices[x+1][y+0];\n      v3 = vertices[x+1][y+1];\n      t0 = new FSS.Triangle(v0, v1, v2, s, material);\n      t1 = new FSS.Triangle(v2, v1, v3, s, material);\n      this.triangles.push(t0, t1);\n    }\n  }\n};\n\nFSS.Plane.prototype = Object.create(FSS.Geometry.prototype);\n\n/**\n * @class Material\n * @author Matthew Wagerfield\n */\nFSS.Material = function(ambient, diffuse) {\n  this.ambient = new FSS.Color(ambient || '#444444');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.slave = new FSS.Color();\n};\n\n/**\n * @class Mesh\n * @author Matthew Wagerfield\n */\nFSS.Mesh = function(geometry, material) {\n  FSS.Object.call(this);\n  this.geometry = geometry || new FSS.Geometry();\n  this.material = material || new FSS.Material();\n  this.side = FSS.FRONT;\n  this.visible = true;\n};\n\nFSS.Mesh.prototype = Object.create(FSS.Object.prototype);\n\nFSS.Mesh.prototype.update = function(lights, calculate) {\n  var t,triangle, l,light, illuminance;\n\n  // Update Geometry\n  this.geometry.update();\n\n  // Calculate the triangle colors\n  if (calculate) {\n\n    // Iterate through Triangles\n    for (t = this.geometry.triangles.length - 1; t >= 0; t--) {\n      triangle = this.geometry.triangles[t];\n\n      // Reset Triangle Color\n      FSS.Vector4.set(triangle.color.rgba);\n\n      // Iterate through Lights\n      for (l = lights.length - 1; l >= 0; l--) {\n        light = lights[l];\n\n        // Calculate Illuminance\n        FSS.Vector3.subtractVectors(light.ray, light.position, triangle.centroid);\n        FSS.Vector3.normalise(light.ray);\n        illuminance = FSS.Vector3.dot(triangle.normal, light.ray);\n        if (this.side === FSS.FRONT) {\n          illuminance = Math.max(illuminance, 0);\n        } else if (this.side === FSS.BACK) {\n          illuminance = Math.abs(Math.min(illuminance, 0));\n        } else if (this.side === FSS.DOUBLE) {\n          illuminance = Math.max(Math.abs(illuminance), 0);\n        }\n\n        // Calculate Ambient Light\n        FSS.Vector4.multiplyVectors(triangle.material.slave.rgba, triangle.material.ambient.rgba, light.ambient.rgba);\n        FSS.Vector4.add(triangle.color.rgba, triangle.material.slave.rgba);\n\n        // Calculate Diffuse Light\n        FSS.Vector4.multiplyVectors(triangle.material.slave.rgba, triangle.material.diffuse.rgba, light.diffuse.rgba);\n        FSS.Vector4.multiplyScalar(triangle.material.slave.rgba, illuminance);\n        FSS.Vector4.add(triangle.color.rgba, triangle.material.slave.rgba);\n      }\n\n      // Clamp & Format Color\n      FSS.Vector4.clamp(triangle.color.rgba, 0, 1);\n    }\n  }\n  return this;\n};\n\n/**\n * @class Scene\n * @author Matthew Wagerfield\n */\nFSS.Scene = function() {\n  this.meshes = [];\n  this.lights = [];\n};\n\nFSS.Scene.prototype = {\n  add: function(object) {\n    if (object instanceof FSS.Mesh && !~this.meshes.indexOf(object)) {\n      this.meshes.push(object);\n    } else if (object instanceof FSS.Light && !~this.lights.indexOf(object)) {\n      this.lights.push(object);\n    }\n    return this;\n  },\n  remove: function(object) {\n    if (object instanceof FSS.Mesh && ~this.meshes.indexOf(object)) {\n      this.meshes.splice(this.meshes.indexOf(object), 1);\n    } else if (object instanceof FSS.Light && ~this.lights.indexOf(object)) {\n      this.lights.splice(this.lights.indexOf(object), 1);\n    }\n    return this;\n  }\n};\n\n/**\n * @class Renderer\n * @author Matthew Wagerfield\n */\nFSS.Renderer = function() {\n  this.width = 0;\n  this.height = 0;\n  this.halfWidth = 0;\n  this.halfHeight = 0;\n};\n\nFSS.Renderer.prototype = {\n  setSize: function(width, height) {\n    if (this.width === width && this.height === height) return;\n    this.width = width;\n    this.height = height;\n    this.halfWidth = this.width * 0.5;\n    this.halfHeight = this.height * 0.5;\n    return this;\n  },\n  clear: function() {\n    return this;\n  },\n  render: function(scene) {\n    return this;\n  }\n};\n\n/**\n * @class SVG Renderer\n * @author Matthew Wagerfield\n */\nFSS.SVGRenderer = function(s) {\n  FSS.Renderer.call(this);\n  this.element = s.g();\n};\n\nFSS.SVGRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.SVGRenderer.prototype.setSize = function(width, height) {\n  FSS.Renderer.prototype.setSize.call(this, width, height);\n  return this;\n};\n\nFSS.SVGRenderer.prototype.clear = function() {\n  FSS.Renderer.prototype.clear.call(this);\n  for (var i = this.element.childNodes.length - 1; i >= 0; i--) {\n    this.element.removeChild(this.element.childNodes[i]);\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.render = function(scene) {\n  FSS.Renderer.prototype.render.call(this, scene);\n  var m,mesh, t,triangle, points, style;\n\n  // Update Meshes\n  for (m = scene.meshes.length - 1; m >= 0; m--) {\n    mesh = scene.meshes[m];\n    if (mesh.visible) {\n      mesh.update(scene.lights, true);\n\n      // Render Triangles\n      for (t = mesh.geometry.triangles.length - 1; t >= 0; t--) {\n        triangle = mesh.geometry.triangles[t];\n\n\t\tif (triangle.polygon.parent() !== this.element) {\n\t\t\tthis.element.append(triangle.polygon);\n\t\t}\n\t\t\n        points  = this.formatPoint(triangle.a)+' ';\n        points += this.formatPoint(triangle.b)+' ';\n        points += this.formatPoint(triangle.c);\n        style = this.formatStyle(triangle.color.format());\n\t\t\n\t\ttriangle.polygon.attr({\n\t\t\tpoints: points,\n\t\t\tstyle: style\n\t\t});\n      }\n    }\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.formatPoint = function(vertex) {\n  return (this.halfWidth+vertex.position[0])+','+(this.halfHeight-vertex.position[1]);\n};\n\nFSS.SVGRenderer.prototype.formatStyle = function(color) {\n  var style = 'fill:'+color+';';\n  style += 'stroke:'+color+';';\n  return style;\n};\n\ndefine(\"vendor/fss\", function(){});\n\ndefine('app/mesh',['require','vendor/fss'],function (require) {\n\t\n\trequire('vendor/fss');\n\t\n\tvar Mesh = function (s, container, colorA, colorB) {\n\t\tvar instance = this,\n\t\t\t_width = 440,\n\t\t\t_height = 440,\n\t\t\tnow,\n\t\t\tstart = Date.now(),\n\t\t\trenderer,\n\t\t\tscene,\n\t\t\tgeometry,\n\t\t\tmaterial,\n\t\t\tmesh,\n\t\t\tlight;\n\t\t\n\t\tinstance.animating = false;\n\t\t\n\t\tinstance.init = function () {\n\t\t\trenderer = new FSS.SVGRenderer(s);\n\t\t\trenderer.setSize(_width, _height);\n\t\t\trenderer.element.transform('translate(-20, -20)'); //keep edges from showing\n\t\t\t\n\t\t\tinstance.el = renderer.element;\n\t\t\t\n\t\t\tcontainer.append(renderer.element);\n\n\t\t\tscene = new FSS.Scene();\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\t\t    geometry = new FSS.Plane(_width, _height, 10, 10, s, material);\n\t\t\tmesh = new FSS.Mesh(geometry, material);\n\t\t\tscene.add(mesh);\n\n\t\t\tlight = new FSS.Light('#eeeeee', '#eeeeee');\n\t\t\tlight.setPosition(300*Math.sin(0.001), 200*Math.cos(0.0005), 100);\n\t\t\tscene.add(light);\n\n\t\t\tnow = Date.now() - start;\n\n\t\t\ttweakMesh();\n\t\t\tdistortMesh();\t\t\t\n\t\t\trenderer.render(scene);\n\t\t}\n\t\t\n\t\tinstance.start = function () {\n\t\t\tinstance.animating = true;\n\t\t\tanimate();\n\t\t}\n\t\t\n\t\tinstance.stop = function () {\n\t\t\tinstance.animating = false;\n\t\t}\n\t\t\n\t\tinstance.setColor = function (colorA, colorB) {\n\t\t\tvar i;\n\t\t\t\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\t\t\t\n\t\t\tfor (i = geometry.triangles.length - 1; i > -1; i -= 1) {\t\n\t\t\t\tgeometry.triangles[i].material = material;\n\t\t\t}\n\t\t\t\n\t\t\tanimate();\n\t\t}\n\t\t\n\t\tinstance.rippleColor = function (colorA, colorB) {\n\t\t\tvar i;\n\t\t\t\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\n\t\t\tfunction colorTriangle(j) {\n\t\t\t\tgeometry.triangles[j].material = material;\n\n\t\t\t\tif (j == 0) {\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\tanimate();\n\t\t\t\t\t}, 10); //force clear\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = geometry.triangles.length - 1; i > -1; i -= 1) {\t\t\t\t\t\t\t\t\n\t\t\t\tvar speed = 200 + Math.sin(0.1 + Math.abs(geometry.triangles[i].centroid[0] / geometry.triangles[i].centroid[1])) * 100;\n\t\t\t\tsetTimeout(colorTriangle, speed * 2, i);\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\tfunction tweakMesh() {\n\t\t\tvar v, vertex;\n\t\t\t\n\t\t\tfor (v = geometry.vertices.length - 1; v >= 0; v--) {\n\t\t\t      vertex = geometry.vertices[v];\n\t\t\t      vertex.anchor = FSS.Vector3.clone(vertex.position);\n\t\t\t      vertex.step = FSS.Vector3.create(\n\t\t\t        Math.randomInRange(0.2, 1.0),\n\t\t\t        Math.randomInRange(0.2, 1.0),\n\t\t\t        Math.randomInRange(0.2, 1.0)\n\t\t\t      );\n\t\t\t\tvertex.time = Math.randomInRange(0, Math.PIM2);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction distortMesh() {\n\t\t\tvar v,\n\t\t\t\tvertex,\n\t\t\t\tox, oy, oz,\n\t\t\t\toffset = 10 / 2;\n\t\t\t\n\t\t\tfor (v = geometry.vertices.length - 1; v >= 0; v--) {\n\t\t      vertex = geometry.vertices[v];\n\t\t      ox = Math.sin(vertex.time + vertex.step[0] * now * 0.002);\n\t\t      oy = Math.cos(vertex.time + vertex.step[1] * now * 0.002);\n\t\t      oz = Math.sin(vertex.time + vertex.step[2] * now * 0.002);\n\t\t      FSS.Vector3.set(vertex.position,\n\t\t        0.2 * geometry.segmentWidth * ox,\n\t\t        0.1 * geometry.sliceHeight * oy,\n\t\t        0.7 * offset * oz - offset);\n\t\t      FSS.Vector3.add(vertex.position, vertex.anchor);\n\t\t    }\n\n\t\t    geometry.dirty = true;\n\t\t}\n\t\n\t\tfunction animate() {\n\t\t\tnow = Date.now() - start;\n\t\t\t\n\t\t\tif (mobilecheck() !== true) {\n\t\t\t\tdistortMesh();\n\t\t\t}\n\t\t\t\n\t\t\trenderer.render(scene);\n\t\t\t\n\t\t\tif (instance.animating !== false) {\n\t\t\t\trequestAnimationFrame(animate);\n\t\t\t}\n\t\t}\n\t\t\n\t\tinstance.init();\n\t}\n\t\n\treturn Mesh;\n});\ndefine('app/logo',['require'],function (require) {\n\t\t\n\tvar Logo = function (s) {\n\t\tvar instance = this,\n\t\t\tlogo,\n\t\t\tparts = [\n\t\t\t\t['top', 0, 20], \n\t\t\t\t['left', 20, 0], \n\t\t\t\t['bottom', 0, -20],\n\t\t\t\t['right', -20, 0]\n\t\t\t],\n\t\t\tcomponents = [],\n\t\t\ti = 0,\n\t\t\tk = 0,\n\t\t\tisLogoAnimated = false,\n\t\t\tisCrocAnimated = false,\n\t\t\tisCroc2Animated = false;\n\t\t\n\t\tlogo = s.select(\"#snap-logo\");\n\n\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\tvar el = parts[i]\n\t\t\telid = el[0];\n\t\t\telement = logo.select(\"#snap-logo-\" + elid);\n\t\t\telement.attr({opacity:0, transform: \"t\" + (el[1]) + \",\" + (el[2])});\n\t\t    components.push(element);\n\t\t}\n\n\t\tfunction animateEach() {\n\t\t\tif (!components[k]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t    components[k].animate({ \n\t\t        transform: \"t\" + (0) + \",\" + (0),\n\t\t        opacity: 1\n\t\t    }, 250, mina.easeout);\n\t\t\tsetTimeout(animateEach, 150);\n\t\t\tk++;\n\t\t};\n\t\t\n\t\tthis.animate = function () {\n\t\t\tsetTimeout(animateEach, 150);\n\t\t}\n\t\t\n\t\tthis.show = function () {\n\t\t\tvar i;\n\t\t\t\n\t\t\tfor (i = 0; i < components.length; i += 1) {\n\t\t\t\tcomponents[i].attr({ \n\t\t\t    \ttransform: \"t\" + (0) + \",\" + (0),\n\t\t\t    \topacity: 1\n\t\t\t    });\n\t\t\t}\n\t\t    \n\t\t}\n\t}\n\t\n\treturn Logo;\n});\ndefine('app/app',['require','snap','app/heart','app/device','app/burst','app/mesh','app/logo'],function (require) {\n\n\trequire('snap');\n\t\n\tvar App,\n\t\tHeart = require('app/heart'),\n\t\tDevice = require('app/device'),\n\t\tBurst = require('app/burst');\n\t\tMesh = require('app/mesh');\n\t\tLogo = require('app/logo');\n\n\tApp = function () {\n\t\tvar instance = this;\n\t\t\n\t\tthis.started = false;\n\t\t\t\t\n\t\tthis.init = function () {\n\t\t\tvar timeline,\n\t\t\t\tad,\n\t\t\t\ts,\n\t\t\t\tcover,\n\t\t\t\tdevice,\n\t\t\t\theart,\n\t\t\t\tburst,\n\t\t\t\tscreen1,\n\t\t\t\ttext1,\n\t\t\t\ttext2,\n\t\t\t\ttext3,\n\t\t\t\ttext4,\n\t\t\t\tresolveScreen,\n\t\t\t\tlogo,\n\t\t\t\tmeshA,\n\t\t\t\tmeshAContainer,\n\t\t\t\treplaycount = 0,\n\t\t\t\tWIDTH = 400,\n\t\t\t\tHEIGHT = 400,\n\t\t\t\tWHITE = \"#ffffff\",\n\t\t\t\tGREEN = \"#09ae8a\";\n\t\t\t\n\t\t\tthis.started = true;\n\t\t\t\n\t\t\tad = document.getElementById('ad');\n\t\t\ts = new Snap(\"#ad\");\n\t\t\tcover = s.select('#cover');\n\t\t\tmeshAContainer = s.select('#meshAContainer');\n\t\t\tscreen1 = s.select('#screen1');\n\t\t\ttext1 = s.select('#text1');\n\t\t\ttext2 = s.select('#text2');\n\t\t\ttext3 = s.select('#text3');\n\t\t\ttext4 = s.select('#text4');\n\t\t\treplayBtn = s.select('#replay-btn');\n\t\t\tresolveScreen = s.select('#resolve');\n\t\t\tlogo = new Logo(s);\n\t\t\t\n\t\t\thandle_RESIZE();\n\t\t\twindow.addEventListener('resize', handle_RESIZE);\n\t\t\tad.addEventListener('click', handle_CLICK);\t\t\t\n\t\t\treplayBtn.click(replay_CLICK);\n\t\t\t\n\t\t\taddMeshA();\t\n\t\t\tcover.remove();\n\t\t\taddHeart();\n\t\t\taddComputer();\n\t\t\taddBurst();\n\t\t\t\n\t\t\tfunction addHeart() {\n\t\t\t\theart = new Heart(s, WIDTH / 2, HEIGHT / 2);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addComputer() {\n\t\t\t\tdevice = new Device(s, WIDTH / 2, HEIGHT / 2);\n\t\t\t\tdevice.setScreen(192, 112);\n\t\t\t\tdevice.setBack(208, 148);\n\t\t\t\tdevice.setScale(0.1);\n\t\t\t\ttext2.after(device.el);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addBurst() {\n\t\t\t\tburst = new Burst(s);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addMeshA() {\n\t\t\t\tmeshA = new Mesh(s, meshAContainer, '#afafaf', '#afafaf');\n\t\t\t}\n\t\t\t\n\t\t\tfunction addMeshB() {\n\t\t\t\tmeshA.el.remove();\n\t\t\t\tmeshB = new Mesh(s, meshBContainer, '#09ae8a', '#777777');\n\t\t\t}\n\t\t\t\n\t\t\tfunction showMeshB() {\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshB.start();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfunction showComputer() {\n\t\t\t\ttext1.animate({y: 80}, 100);\n\t\t\t\ttext2.animate({y: 350}, 100);\n\t\t\t\tdevice.animScale(10, 300, mina.bounce);\n\t\t\t\theart.animFill(WHITE);\n\t\t\t}\n\t\t\t\n\t\t\tfunction toTablet() {\n\t\t\t\tdevice.animRotation(-90);\t\n\t\t\t\tdevice.animScreen(76, 100);\n\t\t\t\tdevice.animBack(92, 132);\n\t\t\t\theart.animScale(0.5, 200);\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction toPhone() {\n\t\t\t\tdevice.hideKeyboard();\n\t\t\t\tdevice.animScreen(48, 76);\n\t\t\t\tdevice.animBack(56, 100);\n\t\t\t\theart.animScale(0.3);\n\t\t\t}\n\t\t\t\n\t\t\tfunction rotate() {\n\t\t\t\tdevice.animRotation(90);\n\t\t\t\theart.animScale(0.4);\n\t\t\t}\n\t\t\t\n\t\t\tfunction zoom() {\n\t\t\t\tmeshA.stop();\n\t\t\t\tdevice.animScale(10, 600);\n\t\t\t\theart.animScale(4, 600);\n\t\t\t\tburst.anim();\n\t\t\t}\n\t\t\t\n\t\t\tfunction greenMesh() {\n\t\t\t\t\n\t\t\t\tmeshA.setColor('#09ae8a', '#777777');\n\t\t\t\t\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.start();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdevice.animOpacity(0, 200);\n\t\t\t\tscreen1.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t\t\n\t\t\tfunction maskReveal() {\n\t\t\t\theart.mask();\n\t\t\t}\n\t\t\t\n\t\t\tfunction showText3() {\n\t\t\t\tdevice.setScale(0.01);\n\t\t\t\ttext3.animate({\n\t\t\t\t\topacity: 1\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t\t\n\t\t\tfunction hideText3() {\n\t\t\t\ttext3.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 200);\n\t\t\t\t\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.rippleColor('#afafaf', '#afafaf');\n\t\t\t\t} else {\n\t\t\t\t\tmeshA.setColor('#afafaf', '#afafaf');\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfunction resolve() {\n\t\t\t\tresolveScreen.animate({\n\t\t\t\t\topacity: 1\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t\t\n\t\t\tfunction stop() {\n\t\t\t\tlogo.animate();\n\t\t\t\tmeshA.stop();\n\t\t\t}\n\t\t\t\n\t\t\tfunction reset() {\n\t\t\t\tresolveScreen.attr({\n\t\t\t\t\topacity: 0\n\t\t\t\t});\t\t\n\t\t\t\t\n\t\t\t\tscreen1.attr({\n\t\t\t\t\topacity: 1\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttext1.attr({y: 130});\n\t\t\t\ttext2.attr({y: 300});\n\t\t\t\t\n\t\t\t\theart.setScale(1);\n\t\t\t\theart.setFill('#0DAE8A');\n\t\t\t\theart.unmask();\n\t\t\t\tdevice.setOpacity(1);\n\t\t\t\tdevice.setScreen(192, 112);\n\t\t\t\tdevice.setBack(208, 148);\n\t\t\t\tdevice.showKeyboard();\n\t\t\t\tmeshA.start();\n\t\t\t\tburst.reset();\n\t\t\t}\n\t\t\t\n\t\t\tfunction replay_CLICK(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t\n\t\t\t\treplaycount += 1;\n\t\t\t\tga('send', 'event', 'button', 'click', 'replay', replaycount);\n\t\t\t\treset();\n\t\t\t\trun();\n\t\t\t}\n\t\t\t\n\t\t\tfunction handle_CLICK(e) {\n\t\t\t\tga('send', 'event', 'button', 'click', 'ad');\n\t\t\t\ttop.window.location.href = 'http://snapsvg.io/';\n\t\t\t}\n\t\t\t\n\t\t\tfunction handle_RESIZE() {\n\t\t\t\tvar _w = window.innerWidth,\n\t\t\t\t\tscale = _w / 400;\n\t\t\t\t\n\t\t\t\tad.style.webkitTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.MozTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.msTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.oTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.transform = 'scale(' + scale + ')';\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction run() {\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.start();\n\t\t\t\t}\n\t\t\t\tsetTimeout(showComputer, 2000);\n\t\t\t\tsetTimeout(toPhone, 3000);\n\t\t\t\tsetTimeout(rotate, 4000);\n\t\t\t\tsetTimeout(toTablet, 5000);\n\t\t\t\tsetTimeout(zoom, 6000);\n\t\t\t\tsetTimeout(greenMesh, 6300);\n\t\t\t\tsetTimeout(maskReveal, 6700);\n\t\t\t\tsetTimeout(showText3, 7000);\n\t\t\t\tsetTimeout(hideText3, 10000);\n\t\t\t\tsetTimeout(resolve, 10500);\n\t\t\t\tsetTimeout(stop, 10900);\n\t\t\t}\n\t\t\t\n\t\t\tfunction basic() {\n\t\t\t\tscreen1.attr({opacity: 0});\n\t\t\t\theart.el.attr({opacity: 0});\n\t\t\t\treplayBtn.attr({opacity: 0});\n\t\t\t\tlogo.show();\n\t\t\t\ttext4.select('tspan').attr({opacity: 0});\n\t\t\t\ttext4.select('tspan:nth-child(2)').attr({y: 120});\n\t\t\t\tresolveScreen.attr({opacity: 1});\n\t\t\t}\n\t\t\t\n\t\t\tif (window.replay !== true) {\n\t\t\t\treplayBtn.attr({opacity: 0});\n\t\t\t}\n\t\t\t\n\t\t\tif (window.supported !== false) {\n\t\t\t\trun();\n\t\t\t} else {\n\t\t\t\tbasic();\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\treturn App;\n});\n/*global require*/\n\nrequire.config({\n    shim: {\n\n    },\n    paths: {\n\t    snap: 'vendor/snap.svg',\n\t    tweenlite: 'vendor/greensock/TweenLite',\n\t    timelinelite: 'vendor/greensock/TimelineLite'\n    }\n});\n\n/**\n* check support\n*/\nwindow.ua = navigator.userAgent.toLowerCase();\nwindow.isAndroid = ua.indexOf(\"android\") > -1;\nwindow.isSafari = ua.indexOf(\"safari\") > -1 && ua.indexOf(\"chrome\") === -1;\n\nfunction checkSVG() {\n\treturn !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n}\n\n/**\n* check mobile\n*/\nwindow.mobilecheck = function() {\n\tvar check = false;\n\t(function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|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/i.test(a)||/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(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)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n\treturn check; \n}\n\nfunction addFallback() {\n\tvar link,\n\t\timg;\n\t\t\n\tlink = document.createElement('a');\n\tlink.href = \"http://snapsvg.io/\";\n\tdocument.body.appendChild(link);\n\t\n\timg = new Image();\n\timg.src = \"backup.jpg\";\n\timg.style.position = \"absolute\";\n\timg.style.top = \"0\";\n\timg.style.left = \"0\";\n\timg.width = \"100%\";\n\tlink.appendChild(img);\n}\n\nwindow.supported = true;\nwindow.replay = true;\n\nrequire(['app/app'], function (App) {\n\t\n\tif (checkSVG() !== true) {\n\t\taddFallback();\n\t\treturn;\n\t}\n\n\tif (isAndroid === true) {\n\t\twindow.supported = false;\n\t}\n\n\tif (isSafari === true) {\n\t\twindow.replay = false;\n\t}\n\t\n\twindow.app = new App();\n\t//app.init(); //fired from font loading\n});\n\n\n\n/**\n* font loading\n*/\nWebFontConfig = {\n\tgoogle: {\n\t\tfamilies: ['Open+Sans:300:latin', 'Source+Sans+Pro::latin']\n\t},\n\tinactive: function () {\n\t\tif (typeof(app) !== 'undefined' && app.started !== true) {\n\t\t\tapp.init();\n\t\t}\n\t},\n\tfontactive: function(familyName, fvd) {\n\t\tif (typeof(app) !== 'undefined' && familyName == 'Open Sans') {\n\t\t\tif (app.started !== true) {\n\t\t\t\tapp.init();\n\t\t\t}\n\t\t}\n\t}\n};\ndefine(\"main\", function(){});\n\n</script>\n\t\t<script src=\"http://ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js\"></script>\n\n\t\t<script>\n\t\t\tWebFont.load(WebFontConfig);\n\t\t</script>\n\t\t\n\t</body>\n</html>\n"
  },
  {
    "path": "demos/snap-ad/site/js/main.js",
    "content": "\n// Snap.svg 0.2.0\n// \n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// \n// build: 2013-12-23\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.4.2 - JavaScript Events Library                      │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n    var version = \"0.4.2\",\n        has = \"hasOwnProperty\",\n        separator = /[\\.\\/]/,\n        wildcard = \"*\",\n        fun = function () {},\n        numsort = function (a, b) {\n            return a - b;\n        },\n        current_event,\n        stop,\n        events = {n: {}},\n    /*\\\n     * eve\n     [ method ]\n\n     * Fires event with given `name`, given scope and other parameters.\n\n     > Arguments\n\n     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n     - scope (object) context for the event handlers\n     - varargs (...) the rest of arguments will be sent to event handlers\n\n     = (object) array of returned values from the listeners\n    \\*/\n        eve = function (name, scope) {\n\t\t\tname = String(name);\n            var e = events,\n                oldstop = stop,\n                args = Array.prototype.slice.call(arguments, 2),\n                listeners = eve.listeners(name),\n                z = 0,\n                f = false,\n                l,\n                indexed = [],\n                queue = {},\n                out = [],\n                ce = current_event,\n                errors = [];\n            current_event = name;\n            stop = 0;\n            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n                indexed.push(listeners[i].zIndex);\n                if (listeners[i].zIndex < 0) {\n                    queue[listeners[i].zIndex] = listeners[i];\n                }\n            }\n            indexed.sort(numsort);\n            while (indexed[z] < 0) {\n                l = queue[indexed[z++]];\n                out.push(l.apply(scope, args));\n                if (stop) {\n                    stop = oldstop;\n                    return out;\n                }\n            }\n            for (i = 0; i < ii; i++) {\n                l = listeners[i];\n                if (\"zIndex\" in l) {\n                    if (l.zIndex == indexed[z]) {\n                        out.push(l.apply(scope, args));\n                        if (stop) {\n                            break;\n                        }\n                        do {\n                            z++;\n                            l = queue[indexed[z]];\n                            l && out.push(l.apply(scope, args));\n                            if (stop) {\n                                break;\n                            }\n                        } while (l)\n                    } else {\n                        queue[l.zIndex] = l;\n                    }\n                } else {\n                    out.push(l.apply(scope, args));\n                    if (stop) {\n                        break;\n                    }\n                }\n            }\n            stop = oldstop;\n            current_event = ce;\n            return out.length ? out : null;\n        };\n\t\t// Undocumented. Debug only.\n\t\teve._events = events;\n    /*\\\n     * eve.listeners\n     [ method ]\n\n     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n     > Arguments\n\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n     = (array) array of event handlers\n    \\*/\n    eve.listeners = function (name) {\n        var names = name.split(separator),\n            e = events,\n            item,\n            items,\n            k,\n            i,\n            ii,\n            j,\n            jj,\n            nes,\n            es = [e],\n            out = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            nes = [];\n            for (j = 0, jj = es.length; j < jj; j++) {\n                e = es[j].n;\n                items = [e[names[i]], e[wildcard]];\n                k = 2;\n                while (k--) {\n                    item = items[k];\n                    if (item) {\n                        nes.push(item);\n                        out = out.concat(item.f || []);\n                    }\n                }\n            }\n            es = nes;\n        }\n        return out;\n    };\n    \n    /*\\\n     * eve.on\n     [ method ]\n     **\n     * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n     | eve.on(\"*.under.*\", f);\n     | eve(\"mouse.under.floor\"); // triggers f\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n     > Example:\n     | eve.on(\"mouse\", eatIt)(2);\n     | eve.on(\"mouse\", scream);\n     | eve.on(\"mouse\", catchIt)(1);\n     * This will ensure that `catchIt()` function will be called before `eatIt()`.\n\t *\n     * If you want to put your handler before non-indexed handlers, specify a negative value.\n     * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n    \\*/\n    eve.on = function (name, f) {\n\t\tname = String(name);\n\t\tif (typeof f != \"function\") {\n\t\t\treturn function () {};\n\t\t}\n        var names = name.split(separator),\n            e = events;\n        for (var i = 0, ii = names.length; i < ii; i++) {\n            e = e.n;\n            e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n        }\n        e.f = e.f || [];\n        for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n            return fun;\n        }\n        e.f.push(f);\n        return function (zIndex) {\n            if (+zIndex == +zIndex) {\n                f.zIndex = +zIndex;\n            }\n        };\n    };\n    /*\\\n     * eve.f\n     [ method ]\n     **\n     * Returns function that will fire given event with optional arguments.\n\t * Arguments that will be passed to the result function will be also\n\t * concated to the list of final arguments.\n \t | el.onclick = eve.f(\"click\", 1, 2);\n \t | eve.on(\"click\", function (a, b, c) {\n \t |     console.log(a, b, c); // 1, 2, [event object]\n \t | });\n     > Arguments\n\t - event (string) event name\n\t - varargs (…) and any other arguments\n\t = (function) possible event handler function\n    \\*/\n\teve.f = function (event) {\n\t\tvar attrs = [].slice.call(arguments, 1);\n\t\treturn function () {\n\t\t\teve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n\t\t};\n\t};\n    /*\\\n     * eve.stop\n     [ method ]\n     **\n     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n    \\*/\n    eve.stop = function () {\n        stop = 1;\n    };\n    /*\\\n     * eve.nt\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     > Arguments\n     **\n     - subname (string) #optional subname of the event\n     **\n     = (string) name of the event, if `subname` is not specified\n     * or\n     = (boolean) `true`, if current event’s name contains `subname`\n    \\*/\n    eve.nt = function (subname) {\n        if (subname) {\n            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(current_event);\n        }\n        return current_event;\n    };\n    /*\\\n     * eve.nts\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     **\n     = (array) names of the event\n    \\*/\n    eve.nts = function () {\n        return current_event.split(separator);\n    };\n    /*\\\n     * eve.off\n     [ method ]\n     **\n     * Removes given function from the list of event listeners assigned to given name.\n\t * If no arguments specified all the events will be cleared.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n    \\*/\n    /*\\\n     * eve.unbind\n     [ method ]\n     **\n     * See @eve.off\n    \\*/\n    eve.off = eve.unbind = function (name, f) {\n\t\tif (!name) {\n\t\t    eve._events = events = {n: {}};\n\t\t\treturn;\n\t\t}\n        var names = name.split(separator),\n            e,\n            key,\n            splice,\n            i, ii, j, jj,\n            cur = [events];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            for (j = 0; j < cur.length; j += splice.length - 2) {\n                splice = [j, 1];\n                e = cur[j].n;\n                if (names[i] != wildcard) {\n                    if (e[names[i]]) {\n                        splice.push(e[names[i]]);\n                    }\n                } else {\n                    for (key in e) if (e[has](key)) {\n                        splice.push(e[key]);\n                    }\n                }\n                cur.splice.apply(cur, splice);\n            }\n        }\n        for (i = 0, ii = cur.length; i < ii; i++) {\n            e = cur[i];\n            while (e.n) {\n                if (f) {\n                    if (e.f) {\n                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n                            e.f.splice(j, 1);\n                            break;\n                        }\n                        !e.f.length && delete e.f;\n                    }\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        var funcs = e.n[key].f;\n                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n                            funcs.splice(j, 1);\n                            break;\n                        }\n                        !funcs.length && delete e.n[key].f;\n                    }\n                } else {\n                    delete e.f;\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        delete e.n[key].f;\n                    }\n                }\n                e = e.n;\n            }\n        }\n    };\n    /*\\\n     * eve.once\n     [ method ]\n     **\n     * Binds given event handler with a given name to only run once then unbind itself.\n     | eve.once(\"login\", f);\n     | eve(\"login\"); // triggers f\n     | eve(\"login\"); // no listeners\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) same return function as @eve.on\n    \\*/\n    eve.once = function (name, f) {\n        var f2 = function () {\n            eve.unbind(name, f2);\n            return f.apply(this, arguments);\n        };\n        return eve.on(name, f2);\n    };\n    /*\\\n     * eve.version\n     [ property (string) ]\n     **\n     * Current version of the library.\n    \\*/\n    eve.version = version;\n    eve.toString = function () {\n        return \"You are running Eve \" + version;\n    };\n    (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : (typeof define != \"undefined\" ? (define(\"eve\", [], function() { return eve; })) : (glob.eve = eve));\n})(this);\n\n(function (glob, factory) {\n    // AMD support\n    if (typeof define === \"function\" && define.amd) {\n        // Define as an anonymous module\n        define('snap',[\"eve\"], function( eve ) {\n            return factory(glob, eve);\n        });\n    } else {\n        // Browser globals (glob is window)\n        // Snap adds itself to window\n        factory(glob, glob.eve);\n    }\n}(this, function (window, eve) {\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n    var animations = {},\n    requestAnimFrame = window.requestAnimationFrame       ||\n                       window.webkitRequestAnimationFrame ||\n                       window.mozRequestAnimationFrame    ||\n                       window.oRequestAnimationFrame      ||\n                       window.msRequestAnimationFrame     ||\n                       function (callback) {\n                           setTimeout(callback, 16);\n                       },\n    isArray = Array.isArray || function (a) {\n        return a instanceof Array ||\n            Object.prototype.toString.call(a) == \"[object Array]\";\n    },\n    idgen = 0,\n    idprefix = \"M\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    diff = function (a, b, A, B) {\n        if (isArray(a)) {\n            res = [];\n            for (var i = 0, ii = a.length; i < ii; i++) {\n                res[i] = diff(a[i], b, A[i], B);\n            }\n            return res;\n        }\n        var dif = (A - a) / (B - b);\n        return function (bb) {\n            return a + dif * (bb - b);\n        };\n    },\n    timer = Date.now || function () {\n        return +new Date;\n    },\n    sta = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.s;\n        }\n        var ds = a.s - val;\n        a.b += a.dur * ds;\n        a.B += a.dur * ds;\n        a.s = val;\n    },\n    speed = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.spd;\n        }\n        a.spd = val;\n    },\n    duration = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.dur;\n        }\n        a.s = a.s * val / a.dur;\n        a.dur = val;\n    },\n    stopit = function () {\n        var a = this;\n        delete animations[a.id];\n        eve(\"mina.stop.\" + a.id, a);\n    },\n    pause = function () {\n        var a = this;\n        if (a.pdif) {\n            return;\n        }\n        delete animations[a.id];\n        a.pdif = a.get() - a.b;\n    },\n    resume = function () {\n        var a = this;\n        if (!a.pdif) {\n            return;\n        }\n        a.b = a.get() - a.pdif;\n        delete a.pdif;\n        animations[a.id] = a;\n    },\n    frame = function () {\n        var len = 0;\n        for (var i in animations) if (animations.hasOwnProperty(i)) {\n            var a = animations[i],\n                b = a.get(),\n                res;\n            len++;\n            a.s = (b - a.b) / (a.dur / a.spd);\n            if (a.s >= 1) {\n                delete animations[i];\n                a.s = 1;\n                len--;\n                (function (a) {\n                    setTimeout(function () {\n                        eve(\"mina.finish.\" + a.id, a);\n                    });\n                }(a));\n            }\n            if (isArray(a.start)) {\n                res = [];\n                for (var j = 0, jj = a.start.length; j < jj; j++) {\n                    res[j] = +a.start[j] +\n                        (a.end[j] - a.start[j]) * a.easing(a.s);\n                }\n            } else {\n                res = +a.start + (a.end - a.start) * a.easing(a.s);\n            }\n            a.set(res);\n        }\n        len && requestAnimFrame(frame);\n    },\n    // SIERRA Unfamiliar with the word _slave_ in this context. Also, I don't know what _gereal_ means. Do you mean _general_?\n    /*\\\n     * mina\n     [ method ]\n     **\n     * Generic animation of numbers\n     **\n     - a (number) start _slave_ number\n     - A (number) end _slave_ number\n     - b (number) start _master_ number (start time in general case)\n     - B (number) end _master_ number (end time in gereal case)\n     - get (function) getter of _master_ number (see @mina.time)\n     - set (function) setter of _slave_ number\n     - easing (function) #optional easing function, default is @mina.linear\n     = (object) animation descriptor\n     o {\n     o         id (string) animation id,\n     o         start (number) start _slave_ number,\n     o         end (number) end _slave_ number,\n     o         b (number) start _master_ number,\n     o         s (number) animation status (0..1),\n     o         dur (number) animation duration,\n     o         spd (number) animation speed,\n     o         get (function) getter of _master_ number (see @mina.time),\n     o         set (function) setter of _slave_ number,\n     o         easing (function) easing function, default is @mina.linear,\n     o         status (function) status getter/setter,\n     o         speed (function) speed getter/setter,\n     o         duration (function) duration getter/setter,\n     o         stop (function) animation stopper\n     o }\n    \\*/\n    mina = function (a, A, b, B, get, set, easing) {\n        var anim = {\n            id: ID(),\n            start: a,\n            end: A,\n            b: b,\n            s: 0,\n            dur: B - b,\n            spd: 1,\n            get: get,\n            set: set,\n            easing: easing || mina.linear,\n            status: sta,\n            speed: speed,\n            duration: duration,\n            stop: stopit,\n            pause: pause,\n            resume: resume\n        };\n        animations[anim.id] = anim;\n        var len = 0, i;\n        for (i in animations) if (animations.hasOwnProperty(i)) {\n            len++;\n            if (len == 2) {\n                break;\n            }\n        }\n        len == 1 && requestAnimFrame(frame);\n        return anim;\n    };\n    /*\\\n     * mina.time\n     [ method ]\n     **\n     * Returns the current time. Equivalent to:\n     | function () {\n     |     return (new Date).getTime();\n     | }\n    \\*/\n    mina.time = timer;\n    /*\\\n     * mina.getById\n     [ method ]\n     **\n     * Returns an animation by its id\n     - id (string) animation's id\n     = (object) See @mina\n    \\*/\n    mina.getById = function (id) {\n        return animations[id] || null;\n    };\n\n    /*\\\n     * mina.linear\n     [ method ]\n     **\n     * Default linear easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.linear = function (n) {\n        return n;\n    };\n    /*\\\n     * mina.easeout\n     [ method ]\n     **\n     * Easeout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeout = function (n) {\n        return Math.pow(n, 1.7);\n    };\n    /*\\\n     * mina.easein\n     [ method ]\n     **\n     * Easein easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easein = function (n) {\n        return Math.pow(n, .48);\n    };\n    /*\\\n     * mina.easeinout\n     [ method ]\n     **\n     * Easeinout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeinout = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        if (n == 0) {\n            return 0;\n        }\n        var q = .48 - n / 1.04,\n            Q = Math.sqrt(.1734 + q * q),\n            x = Q - q,\n            X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n            y = -Q - q,\n            Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n            t = X + Y + .5;\n        return (1 - t) * 3 * t * t + t * t * t;\n    };\n    /*\\\n     * mina.backin\n     [ method ]\n     **\n     * Backin easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backin = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        var s = 1.70158;\n        return n * n * ((s + 1) * n - s);\n    };\n    /*\\\n     * mina.backout\n     [ method ]\n     **\n     * Backout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backout = function (n) {\n        if (n == 0) {\n            return 0;\n        }\n        n = n - 1;\n        var s = 1.70158;\n        return n * n * ((s + 1) * n + s) + 1;\n    };\n    /*\\\n     * mina.elastic\n     [ method ]\n     **\n     * Elastic easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.elastic = function (n) {\n        if (n == !!n) {\n            return n;\n        }\n        return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n            (2 * Math.PI) / .3) + 1;\n    };\n    /*\\\n     * mina.bounce\n     [ method ]\n     **\n     * Bounce easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.bounce = function (n) {\n        var s = 7.5625,\n            p = 2.75,\n            l;\n        if (n < (1 / p)) {\n            l = s * n * n;\n        } else {\n            if (n < (2 / p)) {\n                n -= (1.5 / p);\n                l = s * n * n + .75;\n            } else {\n                if (n < (2.5 / p)) {\n                    n -= (2.25 / p);\n                    l = s * n * n + .9375;\n                } else {\n                    n -= (2.625 / p);\n                    l = s * n * n + .984375;\n                }\n            }\n        }\n        return l;\n    };\n    window.mina = mina;\n    return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function() {\nSnap.version = \"0.2.0\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n    if (w) {\n        if (w.tagName) {\n            return wrap(w);\n        }\n        if (w instanceof Element) {\n            return w;\n        }\n        if (h == null) {\n            w = glob.doc.querySelector(w);\n            return wrap(w);\n        }\n    }\n    w = w == null ? \"100%\" : w;\n    h = h == null ? \"100%\" : h;\n    return new Paper(w, h);\n}\nSnap.toString = function () {\n    return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n    win: window,\n    doc: window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n    Str = String,\n    toFloat = parseFloat,\n    toInt = parseInt,\n    math = Math,\n    mmax = math.max,\n    mmin = math.min,\n    abs = math.abs,\n    pow = math.pow,\n    PI = math.PI,\n    round = math.round,\n    E = \"\",\n    S = \" \",\n    objectToString = Object.prototype.toString,\n    ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n    colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n    bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n    reURLValue = /^url\\(#?([^)]+)\\)$/,\n    spaces = \"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\",\n    separator = new RegExp(\"[,\" + spaces + \"]+\"),\n    whitespace = new RegExp(\"[\" + spaces + \"]\", \"g\"),\n    commaSpaces = new RegExp(\"[\" + spaces + \"]*,[\" + spaces + \"]*\"),\n    hsrg = {hs: 1, rg: 1},\n    pathCommand = new RegExp(\"([a-z])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    tCommand = new RegExp(\"([rstm])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    pathValues = new RegExp(\"(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\" + spaces + \"]*,?[\" + spaces + \"]*\", \"ig\"),\n    idgen = 0,\n    idprefix = \"S\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    xlink = \"http://www.w3.org/1999/xlink\",\n    xmlns = \"http://www.w3.org/2000/svg\",\n    hub = {},\n    URL = Snap.url = function (url) {\n        return \"url('#\" + url + \"')\";\n    };\n\nfunction $(el, attr) {\n    if (attr) {\n        if (typeof el == \"string\") {\n            el = $(el);\n        }\n        if (typeof attr == \"string\") {\n            if (attr.substring(0, 6) == \"xlink:\") {\n                return el.getAttributeNS(xlink, attr.substring(6));\n            }\n            if (attr.substring(0, 4) == \"xml:\") {\n                return el.getAttributeNS(xmlns, attr.substring(4));\n            }\n            return el.getAttribute(attr);\n        }\n        for (var key in attr) if (attr[has](key)) {\n            var val = Str(attr[key]);\n            if (val) {\n                if (key.substring(0, 6) == \"xlink:\") {\n                    el.setAttributeNS(xlink, key.substring(6), val);\n                } else if (key.substring(0, 4) == \"xml:\") {\n                    el.setAttributeNS(xmlns, key.substring(4), val);\n                } else {\n                    el.setAttribute(key, val);\n                }\n            } else {\n                el.removeAttribute(key);\n            }\n        }\n    } else {\n        el = glob.doc.createElementNS(xmlns, el);\n        // el.style && (el.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\");\n    }\n    return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n    var attrs = el.attributes,\n        name,\n        out = {};\n    for (var i = 0; i < attrs.length; i++) {\n        if (attrs[i].namespaceURI == xlink) {\n            name = \"xlink:\";\n        } else {\n            name = \"\";\n        }\n        name += attrs[i].name;\n        out[name] = attrs[i].textContent;\n    }\n    return out;\n}\nfunction is(o, type) {\n    type = Str.prototype.toLowerCase.call(type);\n    if (type == \"finite\") {\n        return isFinite(o);\n    }\n    if (type == \"array\" &&\n        (o instanceof Array || Array.isArray && Array.isArray(o))) {\n        return true;\n    }\n    return  (type == \"null\" && o === null) ||\n            (type == typeof o && o !== null) ||\n            (type == \"object\" && o === Object(o)) ||\n            objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{<name>}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n |     x: 10,\n |     y: 20,\n |     dim: {\n |         width: 40,\n |         height: 50,\n |         \"negative width\": -40\n |     }\n | }));\n\\*/\nSnap.format = (function () {\n    var tokenRegex = /\\{([^\\}]+)\\}/g,\n        objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n        replacer = function (all, key, obj) {\n            var res = obj;\n            key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                name = name || quotedName;\n                if (res) {\n                    if (name in res) {\n                        res = res[name];\n                    }\n                    typeof res == \"function\" && isFunc && (res = res());\n                }\n            });\n            res = (res == null || res == obj ? all : res) + \"\";\n            return res;\n        };\n    return function (str, obj) {\n        return Str(str).replace(tokenRegex, function (all, key) {\n            return replacer(all, key, obj);\n        });\n    };\n})();\nvar preload = (function () {\n    function onerror() {\n        this.parentNode.removeChild(this);\n    }\n    return function (src, f) {\n        var img = glob.doc.createElement(\"img\"),\n            body = glob.doc.body;\n        img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n        img.onload = function () {\n            f.call(img);\n            img.onload = img.onerror = null;\n            body.removeChild(img);\n        };\n        img.onerror = onerror;\n        body.appendChild(img);\n        img.src = src;\n    };\n}());\nfunction clone(obj) {\n    if (typeof obj == \"function\" || Object(obj) !== obj) {\n        return obj;\n    }\n    var res = new obj.constructor;\n    for (var key in obj) if (obj[has](key)) {\n        res[key] = clone(obj[key]);\n    }\n    return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n        return array.push(array.splice(i, 1)[0]);\n    }\n}\nfunction cacher(f, scope, postprocessor) {\n    function newf() {\n        var arg = Array.prototype.slice.call(arguments, 0),\n            args = arg.join(\"\\u2400\"),\n            cache = newf.cache = newf.cache || {},\n            count = newf.count = newf.count || [];\n        if (cache[has](args)) {\n            repush(count, args);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        count.length >= 1e3 && delete cache[count.shift()];\n        count.push(args);\n        cache[args] = f.apply(scope, arg);\n        return postprocessor ? postprocessor(cache[args]) : cache[args];\n    }\n    return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n    if (x3 == null) {\n        var x = x1 - x2,\n            y = y1 - y2;\n        if (!x && !y) {\n            return 0;\n        }\n        return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n    } else {\n        return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n    }\n}\nfunction rad(deg) {\n    return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n    return rad * 180 / PI % 360;\n}\nfunction x_y() {\n    return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n    return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n// SIERRA for which point is the angle calculated?\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n > Parameters\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n    tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n    if (is(values, \"array\")) {\n        var i = values.length;\n        while (i--) if (abs(values[i] - value) <= tolerance) {\n            return values[i];\n        }\n    } else {\n        values = +values;\n        var rem = value % values;\n        if (rem < tolerance) {\n            return value - rem;\n        }\n        if (rem > values - tolerance) {\n            return value - rem + values;\n        }\n    }\n    return value;\n};\n\n// MATRIX\nfunction Matrix(a, b, c, d, e, f) {\n    if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n        this.a = a.a;\n        this.b = a.b;\n        this.c = a.c;\n        this.d = a.d;\n        this.e = a.e;\n        this.f = a.f;\n        return;\n    }\n    if (a != null) {\n        this.a = +a;\n        this.b = +b;\n        this.c = +c;\n        this.d = +d;\n        this.e = +e;\n        this.f = +f;\n    } else {\n        this.a = 1;\n        this.b = 0;\n        this.c = 0;\n        this.d = 1;\n        this.e = 0;\n        this.f = 0;\n    }\n}\n(function (matrixproto) {\n    /*\\\n     * Matrix.add\n     [ method ]\n     **\n     * Adds the given matrix to existing one\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     * or\n     - matrix (object) @Matrix\n    \\*/\n    matrixproto.add = function (a, b, c, d, e, f) {\n        var out = [[], [], []],\n            m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\n            matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\n            x, y, z, res;\n\n        if (a && a instanceof Matrix) {\n            matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\n        }\n\n        for (x = 0; x < 3; x++) {\n            for (y = 0; y < 3; y++) {\n                res = 0;\n                for (z = 0; z < 3; z++) {\n                    res += m[x][z] * matrix[z][y];\n                }\n                out[x][y] = res;\n            }\n        }\n        this.a = out[0][0];\n        this.b = out[1][0];\n        this.c = out[0][1];\n        this.d = out[1][1];\n        this.e = out[0][2];\n        this.f = out[1][2];\n        return this;\n    };\n    /*\\\n     * Matrix.invert\n     [ method ]\n     **\n     * Returns an inverted version of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.invert = function () {\n        var me = this,\n            x = me.a * me.d - me.b * me.c;\n        return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n    };\n    /*\\\n     * Matrix.clone\n     [ method ]\n     **\n     * Returns a copy of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.clone = function () {\n        return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n    };\n    /*\\\n     * Matrix.translate\n     [ method ]\n     **\n     * Translate the matrix\n     - x (number) horizontal offset distance\n     - y (number) vertical offset distance\n    \\*/\n    matrixproto.translate = function (x, y) {\n        return this.add(1, 0, 0, 1, x, y);\n    };\n    /*\\\n     * Matrix.scale\n     [ method ]\n     **\n     * Scales the matrix\n     - x (number) amount to be scaled, with `1` resulting in no change\n     - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n     - cx (number) #optional horizontal origin point from which to scale\n     - cy (number) #optional vertical origin point from which to scale\n     * Default cx, cy is the middle point of the element.\n    \\*/\n    matrixproto.scale = function (x, y, cx, cy) {\n        y == null && (y = x);\n        (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\n        this.add(x, 0, 0, y, 0, 0);\n        (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\n        return this;\n    };\n    /*\\\n     * Matrix.rotate\n     [ method ]\n     **\n     * Rotates the matrix\n     - a (number) angle of rotation, in degrees\n     - x (number) horizontal origin point from which to rotate\n     - y (number) vertical origin point from which to rotate\n    \\*/\n    matrixproto.rotate = function (a, x, y) {\n        a = rad(a);\n        x = x || 0;\n        y = y || 0;\n        var cos = +math.cos(a).toFixed(9),\n            sin = +math.sin(a).toFixed(9);\n        this.add(cos, sin, -sin, cos, x, y);\n        return this.add(1, 0, 0, 1, -x, -y);\n    };\n    /*\\\n     * Matrix.x\n     [ method ]\n     **\n     * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n     - x (number)\n     - y (number)\n     = (number) x\n    \\*/\n    matrixproto.x = function (x, y) {\n        return x * this.a + y * this.c + this.e;\n    };\n    /*\\\n     * Matrix.y\n     [ method ]\n     **\n     * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n     - x (number)\n     - y (number)\n     = (number) y\n    \\*/\n    matrixproto.y = function (x, y) {\n        return x * this.b + y * this.d + this.f;\n    };\n    matrixproto.get = function (i) {\n        return +this[Str.fromCharCode(97 + i)].toFixed(4);\n    };\n    matrixproto.toString = function () {\n        return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n    };\n    matrixproto.offset = function () {\n        return [this.e.toFixed(4), this.f.toFixed(4)];\n    };\n    function norm(a) {\n        return a[0] * a[0] + a[1] * a[1];\n    }\n    function normalize(a) {\n        var mag = math.sqrt(norm(a));\n        a[0] && (a[0] /= mag);\n        a[1] && (a[1] /= mag);\n    }\n    /*\\\n     * Matrix.split\n     [ method ]\n     **\n     * Splits matrix into primitive transformations\n     = (object) in format:\n     o dx (number) translation by x\n     o dy (number) translation by y\n     o scalex (number) scale by x\n     o scaley (number) scale by y\n     o shear (number) shear\n     o rotate (number) rotation in deg\n     o isSimple (boolean) could it be represented via simple transformations\n    \\*/\n    matrixproto.split = function () {\n        var out = {};\n        // translation\n        out.dx = this.e;\n        out.dy = this.f;\n\n        // scale and shear\n        var row = [[this.a, this.c], [this.b, this.d]];\n        out.scalex = math.sqrt(norm(row[0]));\n        normalize(row[0]);\n\n        out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n        row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n        out.scaley = math.sqrt(norm(row[1]));\n        normalize(row[1]);\n        out.shear /= out.scaley;\n\n        // rotation\n        var sin = -row[0][1],\n            cos = row[1][1];\n        if (cos < 0) {\n            out.rotate = deg(math.acos(cos));\n            if (sin < 0) {\n                out.rotate = 360 - out.rotate;\n            }\n        } else {\n            out.rotate = deg(math.asin(sin));\n        }\n\n        out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n        out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n        out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n        return out;\n    };\n    /*\\\n     * Matrix.toTransformString\n     [ method ]\n     **\n     * Returns transform string that represents given matrix\n     = (string) transform string\n    \\*/\n    matrixproto.toTransformString = function (shorter) {\n        var s = shorter || this.split();\n        if (s.isSimple) {\n            s.scalex = +s.scalex.toFixed(4);\n            s.scaley = +s.scaley.toFixed(4);\n            s.rotate = +s.rotate.toFixed(4);\n            return  (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) + \n                    (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E) +\n                    (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E);\n        } else {\n            return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n        }\n    };\n})(Matrix.prototype);\n/*\\\n * Snap.Matrix\n [ method ]\n **\n * Utility method\n **\n * Returns a matrix based on the given parameters\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - svgMatrix (SVGMatrix)\n = (object) @Matrix\n\\*/\nSnap.Matrix = Matrix;\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n # <ul>\n #     <li>Color name (<code>red</code>, <code>green</code>, <code>cornflowerblue</code>, etc)</li>\n #     <li>#••• — shortened HTML color: (<code>#000</code>, <code>#fc0</code>, etc.)</li>\n #     <li>#•••••• — full length HTML color: (<code>#000000</code>, <code>#bd2300</code>)</li>\n #     <li>rgb(•••, •••, •••) — red, green and blue channels values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n #     <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n #     <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n #     <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsl(•••, •••, •••) — hue, saturation and luminosity values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n #     <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n # </ul>\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n    if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    if (colour == \"none\") {\n        return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n    }\n    !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n    if (!colour) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    var res,\n        red,\n        green,\n        blue,\n        opacity,\n        t,\n        values,\n        rgb = colour.match(colourRegExp);\n    if (rgb) {\n        if (rgb[2]) {\n            blue = toInt(rgb[2].substring(5), 16);\n            green = toInt(rgb[2].substring(3, 5), 16);\n            red = toInt(rgb[2].substring(1, 3), 16);\n        }\n        if (rgb[3]) {\n            blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n            green = toInt((t = rgb[3].charAt(2)) + t, 16);\n            red = toInt((t = rgb[3].charAt(1)) + t, 16);\n        }\n        if (rgb[4]) {\n            values = rgb[4].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red *= 2.55);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green *= 2.55);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue *= 2.55);\n            rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n        }\n        if (rgb[5]) {\n            values = rgb[5].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsb2rgb(red, green, blue, opacity);\n        }\n        if (rgb[6]) {\n            values = rgb[6].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsl2rgb(red, green, blue, opacity);\n        }\n        red = mmin(math.round(red), 255);\n        green = mmin(math.round(green), 255);\n        blue = mmin(math.round(blue), 255);\n        opacity = mmin(mmax(opacity, 0), 1);\n        rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n        rgb.hex = \"#\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\n        rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n        return rgb;\n    }\n    return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n// SIERRA It seems odd that the following 3 conversion methods are not expressed as .this2that(), like the others.\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n    return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n    return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n    if (is(o, \"finite\")) {\n        var round = math.round;\n        return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n    }\n    return \"#\" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);\n});\nvar toHex = function (color) {\n    var i = glob.doc.getElementsByTagName(\"head\")[0],\n        red = \"rgb(255, 0, 0)\";\n    toHex = cacher(function (color) {\n        if (color.toLowerCase() == \"red\") {\n            return red;\n        }\n        i.style.color = red;\n        i.style.color = color;\n        var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n        return out == red ? null : out;\n    });\n    return toHex(color);\n},\nhsbtoString = function () {\n    return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n    return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n    return this.opacity == 1 || this.opacity == null ?\n            this.hex :\n            \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n    if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n        b = r.b;\n        g = r.g;\n        r = r.r;\n    }\n    if (g == null && is(r, string)) {\n        var clr = Snap.getRGB(r);\n        r = clr.r;\n        g = clr.g;\n        b = clr.b;\n    }\n    if (r > 1 || g > 1 || b > 1) {\n        r /= 255;\n        g /= 255;\n        b /= 255;\n    }\n    \n    return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n    r = math.round(r * 255);\n    g = math.round(g * 255);\n    b = math.round(b * 255);\n    var rgb = {\n        r: r,\n        g: g,\n        b: b,\n        opacity: is(o, \"finite\") ? o : 1,\n        hex: Snap.rgb(r, g, b),\n        toString: rgbtoString\n    };\n    is(o, \"finite\") && (rgb.opacity = o);\n    return rgb;\n};\n// SIERRA Clarify if Snap does not support consolidated HSLA/RGBA colors. E.g., can you specify a semi-transparent value for Snap.filter.shadow()?\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) `true` if string can't be parsed,\n o     h (number) hue,\n o     s (number) saturation,\n o     v (number) value (brightness),\n o     l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n    var rgb;\n    if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n        rgb = Snap.hsb2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n        rgb = Snap.hsl2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else {\n        if (is(clr, \"string\")) {\n            clr = Snap.getRGB(clr);\n        }\n        if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n            rgb = Snap.rgb2hsl(clr);\n            clr.h = rgb.h;\n            clr.s = rgb.s;\n            clr.l = rgb.l;\n            rgb = Snap.rgb2hsb(clr);\n            clr.v = rgb.b;\n        } else {\n            clr = {hex: \"none\"};\n            clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            clr.error = 1;\n        }\n    }\n    clr.toString = rgbtoString;\n    return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n        v = h.b;\n        s = h.s;\n        h = h.h;\n        o = h.o;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = v * s;\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = v - C;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n        l = h.l;\n        s = h.s;\n        h = h.h;\n    }\n    if (h > 1 || s > 1 || l > 1) {\n        h /= 360;\n        s /= 100;\n        l /= 100;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = 2 * s * (l < .5 ? l : 1 - l);\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = l - C / 2;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, V, C;\n    V = mmax(r, g, b);\n    C = V - mmin(r, g, b);\n    H = (C == 0 ? null :\n         V == r ? (g - b) / C :\n         V == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4\n        );\n    H = ((H + 360) % 6) * 60 / 360;\n    S = C == 0 ? 0 : C / V;\n    return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, L, M, m, C;\n    M = mmax(r, g, b);\n    m = mmin(r, g, b);\n    C = M - m;\n    H = (C == 0 ? null :\n         M == r ? (g - b) / C :\n         M == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4);\n    H = ((H + 360) % 6) * 60 / 360;\n    L = (M + m) / 2;\n    S = (C == 0 ? 0 :\n         L < .5 ? C / (2 * L) :\n                  C / (2 - 2 * L));\n    return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n// SIERRA Snap.parsePathString(): By _array of arrays,_ I assume you mean a format like this for two separate segments? [ [\"M10,10\",\"L90,90\"], [\"M90,10\",\"L10,90\"] ] Otherwise how is each command structured?\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n    if (!pathString) {\n        return null;\n    }\n    var pth = Snap.path(pathString);\n    if (pth.arr) {\n        return Snap.path.clone(pth.arr);\n    }\n    \n    var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n        data = [];\n    if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(pathString);\n    }\n    if (!data.length) {\n        Str(pathString).replace(pathCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            if (name == \"m\" && params.length > 2) {\n                data.push([b].concat(params.splice(0, 2)));\n                name = \"l\";\n                b = b == \"m\" ? \"l\" : \"L\";\n            }\n            if (name == \"o\" && params.length == 1) {\n                data.push([b, params[0]]);\n            }\n            if (name == \"r\") {\n                data.push([b].concat(params));\n            } else while (params.length >= paramCounts[name]) {\n                data.push([b].concat(params.splice(0, paramCounts[name])));\n                if (!paramCounts[name]) {\n                    break;\n                }\n            }\n        });\n    }\n    data.toString = Snap.path.toString;\n    pth.arr = Snap.path.clone(data);\n    return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n    if (!TString) {\n        return null;\n    }\n    var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n        data = [];\n    if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(TString);\n    }\n    if (!data.length) {\n        Str(TString).replace(tCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            data.push([b].concat(params));\n        });\n    }\n    data.toString = Snap.path.toString;\n    return data;\n};\nfunction svgTransform2string(tstr) {\n    var res = [];\n    tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n        params = params.split(/\\s*,\\s*|\\s+/);\n        if (name == \"rotate\" && params.length == 1) {\n            params.push(0, 0);\n        }\n        if (name == \"scale\") {\n            if (params.length == 2) {\n                params.push(0, 0);\n            }\n            if (params.length == 1) {\n                params.push(params[0], 0, 0);\n            }\n        }\n        if (name == \"skewX\") {\n            res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n        } else if (name == \"skewY\") {\n            res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n        } else {\n            res.push([name.charAt(0)].concat(params));\n        }\n        return all;\n    });\n    return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = new RegExp(\"^[a-z][\" + spaces + \"]*-?\\\\.?\\\\d\", \"i\");\nfunction transform2matrix(tstr, bbox) {\n    var tdata = parseTransformString(tstr),\n        m = new Matrix;\n    if (tdata) {\n        for (var i = 0, ii = tdata.length; i < ii; i++) {\n            var t = tdata[i],\n                tlen = t.length,\n                command = Str(t[0]).toLowerCase(),\n                absolute = t[0] != command,\n                inver = absolute ? m.invert() : 0,\n                x1,\n                y1,\n                x2,\n                y2,\n                bb;\n            if (command == \"t\" && tlen == 2){\n                m.translate(t[1], 0);\n            } else if (command == \"t\" && tlen == 3) {\n                if (absolute) {\n                    x1 = inver.x(0, 0);\n                    y1 = inver.y(0, 0);\n                    x2 = inver.x(t[1], t[2]);\n                    y2 = inver.y(t[1], t[2]);\n                    m.translate(x2 - x1, y2 - y1);\n                } else {\n                    m.translate(t[1], t[2]);\n                }\n            } else if (command == \"r\") {\n                if (tlen == 2) {\n                    bb = bb || bbox;\n                    m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.rotate(t[1], x2, y2);\n                    } else {\n                        m.rotate(t[1], t[2], t[3]);\n                    }\n                }\n            } else if (command == \"s\") {\n                if (tlen == 2 || tlen == 3) {\n                    bb = bb || bbox;\n                    m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.scale(t[1], t[1], x2, y2);\n                    } else {\n                        m.scale(t[1], t[1], t[2], t[3]);\n                    }\n                } else if (tlen == 5) {\n                    if (absolute) {\n                        x2 = inver.x(t[3], t[4]);\n                        y2 = inver.y(t[3], t[4]);\n                        m.scale(t[1], t[2], x2, y2);\n                    } else {\n                        m.scale(t[1], t[2], t[3], t[4]);\n                    }\n                }\n            } else if (command == \"m\" && tlen == 7) {\n                m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n            }\n        }\n    }\n    return m;\n}\nSnap._.transform2matrix = transform2matrix;\nfunction extractTransform(el, tstr) {\n    if (tstr == null) {\n        var doReturn = true;\n        if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n            tstr = el.node.getAttribute(\"gradientTransform\");\n        } else if (el.type == \"pattern\") {\n            tstr = el.node.getAttribute(\"patternTransform\");\n        } else {\n            tstr = el.node.getAttribute(\"transform\");\n        }\n        if (!tstr) {\n            return new Matrix;\n        }\n        tstr = svgTransform2string(tstr);\n    } else {\n        if (!Snap._.rgTransform.test(tstr)) {\n            tstr = svgTransform2string(tstr);\n        } else {\n            tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || E);\n        }\n        if (is(tstr, \"array\")) {\n            tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n        }\n        el._.transform = tstr;\n    }\n    var m = transform2matrix(tstr, el.getBBox(1));\n    if (doReturn) {\n        return m;\n    } else {\n        el.matrix = m;\n    }\n}\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n    function (a, b) {\n        var adown = a.nodeType == 9 ? a.documentElement : a,\n            bup = b && b.parentNode;\n            return a == bup || !!(bup && bup.nodeType == 1 && (\n                adown.contains ?\n                    adown.contains(bup) :\n                    a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n            ));\n    } :\n    function (a, b) {\n        if (b) {\n            while (b) {\n                b = b.parentNode;\n                if (b == a) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\nfunction getSomeDefs(el) {\n    var cache = Snap._.someDefs;\n    if (cache && contains(cache.ownerDocument.documentElement, cache)) {\n        return cache;\n    }\n    var p = (el.node.ownerSVGElement && wrap(el.node.ownerSVGElement)) ||\n            (el.node.parentNode && wrap(el.node.parentNode)) ||\n            Snap.select(\"svg\") ||\n            Snap(0, 0),\n        pdefs = p.select(\"defs\"),\n        defs  = pdefs == null ? false : pdefs.node;\n    if (!defs) {\n        defs = make(\"defs\", p.node).node;\n    }\n    Snap._.someDefs = defs;\n    return defs;\n}\nSnap._.getSomeDefs = getSomeDefs;\nfunction unit2px(el, name, value) {\n    var defs = getSomeDefs(el),\n        out = {},\n        mgr = defs.querySelector(\".svg---mgr\");\n    if (!mgr) {\n        mgr = $(\"rect\");\n        $(mgr, {width: 10, height: 10, \"class\": \"svg---mgr\"});\n        defs.appendChild(mgr);\n    }\n    function getW(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {width: val});\n        return mgr.getBBox().width;\n    }\n    function getH(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {height: val});\n        return mgr.getBBox().height;\n    }\n    function set(nam, f) {\n        if (name == null) {\n            out[nam] = f(el.attr(nam));\n        } else if (nam == name) {\n            out = f(value == null ? el.attr(nam) : value);\n        }\n    }\n    switch (el.type) {\n        case \"rect\":\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        case \"image\":\n            set(\"width\", getW);\n            set(\"height\", getH);\n        case \"text\":\n            set(\"x\", getW);\n            set(\"y\", getH);\n        break;\n        case \"circle\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"r\", getW);\n        break;\n        case \"ellipse\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        break;\n        case \"line\":\n            set(\"x1\", getW);\n            set(\"x2\", getW);\n            set(\"y1\", getH);\n            set(\"y2\", getH);\n        break;\n        case \"marker\":\n            set(\"refX\", getW);\n            set(\"markerWidth\", getW);\n            set(\"refY\", getH);\n            set(\"markerHeight\", getH);\n        break;\n        case \"radialGradient\":\n            set(\"fx\", getW);\n            set(\"fy\", getH);\n        break;\n        case \"tspan\":\n            set(\"dx\", getW);\n            set(\"dy\", getH);\n        break;\n        default:\n            set(name, getW);\n    }\n    return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n    return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n    var nodelist = glob.doc.querySelectorAll(query),\n        set = (Snap.set || Array)();\n    for (var i = 0; i < nodelist.length; i++) {\n        set.push(wrap(nodelist[i]));\n    }\n    return set;\n};\n\nfunction add2group(list) {\n    if (!is(list, \"array\")) {\n        list = Array.prototype.slice.call(arguments, 0);\n    }\n    var i = 0,\n        j = 0,\n        node = this.node;\n    while (this[i]) delete this[i++];\n    for (i = 0; i < list.length; i++) {\n        if (list[i].type == \"set\") {\n            list[i].forEach(function (el) {\n                node.appendChild(el.node);\n            });\n        } else {\n            node.appendChild(list[i].node);\n        }\n    }\n    var children = node.childNodes;\n    for (i = 0; i < children.length; i++) {\n        this[j++] = wrap(children[i]);\n    }\n    return this;\n}\nfunction Element(el) {\n    if (el.snap in hub) {\n        return hub[el.snap];\n    }\n    var id = this.id = ID(),\n        svg;\n    try {\n        svg = el.ownerSVGElement;\n    } catch(e) {}\n    this.node = el;\n    if (svg) {\n        this.paper = new Paper(svg);\n    }\n    this.type = el.tagName;\n    this.anims = {};\n    this._ = {\n        transform: []\n    };\n    el.snap = id;\n    hub[id] = this;\n    if (this.type == \"g\") {\n        this.add = add2group;\n        for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n            this[method] = Paper.prototype[method];\n        }\n    }\n}\nfunction arrayFirstValue(arr) {\n    var res;\n    for (var i = 0, ii = arr.length; i < ii; i++) {\n        res = res || arr[i];\n        if (res) {\n            return res;\n        }\n    }\n}\n(function (elproto) {\n    /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Gets or sets given attributes of the element\n     **\n     - params (object) contains key-value pairs of attributes you want to set\n     * or\n     - param (string) name of the attribute\n     = (Element) the current element\n     * or\n     = (string) value of attribute\n     > Usage\n     | el.attr({\n     |     fill: \"#fc0\",\n     |     stroke: \"#000\",\n     |     strokeWidth: 2, // CamelCase...\n     |     \"fill-opacity\": 0.5 // or dash-separated names\n     | });\n     | console.log(el.attr(\"fill\")); // #fc0\n    \\*/\n    elproto.attr = function (params, value) {\n        var el = this,\n            node = el.node;\n        if (!params) {\n            return el;\n        }\n        if (is(params, \"string\")) {\n            if (arguments.length > 1) {\n                var json = {};\n                json[params] = value;\n                params = json;\n            } else {\n                return arrayFirstValue(eve(\"snap.util.getattr.\"+params, el));\n            }\n        }\n        for (var att in params) {\n            if (params[has](att)) {\n                eve(\"snap.util.attr.\" + att, el, params[att]);\n            }\n        }\n        return el;\n    };\n// SIERRA Element.getBBox(): Unclear why you would want to express the dimension of the box as a path.\n// SIERRA Element.getBBox(): Unclear why you would want to use r0/r1/r2. Also, basic definitions: wouldn't the _smallest circle that can be enclosed_ be a zero-radius point?\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Returns the bounding box descriptor for the given element\n     **\n     = (object) bounding box descriptor:\n     o {\n     o     cx: (number) x of the center,\n     o     cy: (number) x of the center,\n     o     h: (number) height,\n     o     height: (number) height,\n     o     path: (string) path command for the box,\n     o     r0: (number) radius of a circle that fully encloses the box,\n     o     r1: (number) radius of the smallest circle that can be enclosed,\n     o     r2: (number) radius of the largest circle that can be enclosed,\n     o     vb: (string) box as a viewbox command,\n     o     w: (number) width,\n     o     width: (number) width,\n     o     x2: (number) x of the right side,\n     o     x: (number) x of the left side,\n     o     y2: (number) y of the bottom edge,\n     o     y: (number) y of the top edge\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        var el = this;\n        if (el.type == \"use\") {\n            el = el.original;\n        }\n        if (el.removed) {\n            return {};\n        }\n        var _ = el._;\n        if (isWithoutTransform) {\n            _.bboxwt = Snap.path.get[el.type] ? Snap.path.getBBox(el.realPath = Snap.path.get[el.type](el)) : Snap._.box(el.node.getBBox());\n            return Snap._.box(_.bboxwt);\n        } else {\n            el.realPath = (Snap.path.get[el.type] || Snap.path.get.deflt)(el);\n            _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, el.matrix));\n        }\n        return Snap._.box(_.bbox);\n    };\n    var propString = function () {\n        return this.string;\n    };\n// SIERRA Element.transform(): seems to allow two return values, one of which (_Element_) is undefined.\n// SIERRA Element.transform(): if this only accepts one argument, it's unclear how it can both _get_ and _set_ a transform.\n// SIERRA Element.transform(): Unclear how Snap transform string format differs from SVG's.\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Gets or sets transformation of the element\n     **\n     - tstr (string) transform string in Snap or SVG format\n     = (Element) the current element\n     * or\n     = (object) transformation descriptor:\n     o {\n     o     string (string) transform string,\n     o     globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n     o     localMatrix (Matrix) matrix of transformations applied only to the element,\n     o     diffMatrix (Matrix) matrix of difference between global and local transformations,\n     o     global (string) global transformation as string,\n     o     local (string) local transformation as string,\n     o     toString (function) returns `string` property\n     o }\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            var global = new Matrix(this.node.getCTM()),\n                local = extractTransform(this),\n                localString = local.toTransformString(),\n                string = Str(local) == Str(this.matrix) ?\n                            _.transform : localString;\n            return {\n                string: string,\n                globalMatrix: global,\n                localMatrix: local,\n                diffMatrix: global.clone().add(local.invert()),\n                global: global.toTransformString(),\n                local: localString,\n                toString: propString\n            };\n        }\n        if (tstr instanceof Matrix) {\n            // may be need to apply it directly\n            // TODO: investigate\n            tstr = tstr.toTransformString();\n        }\n        extractTransform(this, tstr);\n\n        if (this.node) {\n            if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n                $(this.node, {gradientTransform: this.matrix});\n            } else if (this.type == \"pattern\") {\n                $(this.node, {patternTransform: this.matrix});\n            } else {\n                $(this.node, {transform: this.matrix});\n            }\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.parent\n     [ method ]\n     **\n     * Returns the element's parent\n     **\n     = (Element) the parent element\n    \\*/\n    elproto.parent = function () {\n        return wrap(this.node.parentNode);\n    };\n    /*\\\n     * Element.append\n     [ method ]\n     **\n     * Appends the given element to current one\n     **\n     - el (Element|Set) element to append\n     = (Element) the parent element\n    \\*/\n    /*\\\n     * Element.add\n     [ method ]\n     **\n     * See @Element.append\n    \\*/\n    elproto.append = elproto.add = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this;\n                el.forEach(function (el) {\n                    it.add(el);\n                });\n                return this;\n            }\n            el = wrap(el);\n            this.node.appendChild(el.node);\n            el.paper = this.paper;\n        }\n        return this;\n    };\n    /*\\\n     * Element.appendTo\n     [ method ]\n     **\n     * Appends the current element to the given one\n     **\n     - el (Element) parent element to append to\n     = (Element) the child element\n    \\*/\n    elproto.appendTo = function (el) {\n        if (el) {\n            el = wrap(el);\n            el.append(this);\n        }\n        return this;\n    };\n    /*\\\n     * Element.prepend\n     [ method ]\n     **\n     * Prepends the given element to the current one\n     **\n     - el (Element) element to prepend\n     = (Element) the parent element\n    \\*/\n    elproto.prepend = function (el) {\n        if (el) {\n            el = wrap(el);\n            var parent = el.parent();\n            this.node.insertBefore(el.node, this.node.firstChild);\n            this.add && this.add();\n            el.paper = this.paper;\n            this.parent() && this.parent().add();\n            parent && parent.add();\n        }\n        return this;\n    };\n    /*\\\n     * Element.prependTo\n     [ method ]\n     **\n     * Prepends the current element to the given one\n     **\n     - el (Element) parent element to prepend to\n     = (Element) the child element\n    \\*/\n    elproto.prependTo = function (el) {\n        el = wrap(el);\n        el.prepend(this);\n        return this;\n    };\n    /*\\\n     * Element.before\n     [ method ]\n     **\n     * Inserts given element before the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.before = function (el) {\n        if (el.type == \"set\") {\n            var it = this;\n            el.forEach(function (el) {\n                var parent = el.parent();\n                it.node.parentNode.insertBefore(el.node, it.node);\n                parent && parent.add();\n            });\n            this.parent().add();\n            return this;\n        }\n        el = wrap(el);\n        var parent = el.parent();\n        this.node.parentNode.insertBefore(el.node, this.node);\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.after\n     [ method ]\n     **\n     * Inserts given element after the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.after = function (el) {\n        el = wrap(el);\n        var parent = el.parent();\n        if (this.node.nextSibling) {\n            this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n        } else {\n            this.node.parentNode.appendChild(el.node);\n        }\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertBefore = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertAfter = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the DOM\n     = (Element) the detached element\n    \\*/\n    elproto.remove = function () {\n        var parent = this.parent();\n        this.node.parentNode && this.node.parentNode.removeChild(this.node);\n        delete this.paper;\n        this.removed = true;\n        parent && parent.add();\n        return this;\n    };\n    /*\\\n     * Element.select\n     [ method ]\n     **\n     * Gathers the nested @Element matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Element) result of query selection\n    \\*/\n    elproto.select = function (query) {\n        return wrap(this.node.querySelector(query));\n    };\n    /*\\\n     * Element.selectAll\n     [ method ]\n     **\n     * Gathers nested @Element objects matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Set|array) result of query selection\n    \\*/\n    elproto.selectAll = function (query) {\n        var nodelist = this.node.querySelectorAll(query),\n            set = (Snap.set || Array)();\n        for (var i = 0; i < nodelist.length; i++) {\n            set.push(wrap(nodelist[i]));\n        }\n        return set;\n    };\n    /*\\\n     * Element.asPX\n     [ method ]\n     **\n     * Returns given attribute of the element as a `px` value (not %, em, etc.)\n     **\n     - attr (string) attribute name\n     - value (string) #optional attribute value\n     = (Element) result of query selection\n    \\*/\n    elproto.asPX = function (attr, value) {\n        if (value == null) {\n            value = this.attr(attr);\n        }\n        return +unit2px(this, attr, value);\n    };\n    // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned <use> instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n    /*\\\n     * Element.use\n     [ method ]\n     **\n     * Creates a `<use>` element linked to the current element\n     **\n     = (Element) the `<use>` element\n    \\*/\n    elproto.use = function () {\n        var use,\n            id = this.node.id;\n        if (!id) {\n            id = this.id;\n            $(this.node, {\n                id: id\n            });\n        }\n        if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n            this.type == \"pattern\") {\n            use = make(this.type, this.node.parentNode);\n        } else {\n            use = make(\"use\", this.node.parentNode);\n        }\n        $(use.node, {\n            \"xlink:href\": \"#\" + id\n        });\n        use.original = this;\n        return use;\n    };\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     * Creates a clone of the element and inserts it after the element\n     **\n     = (Element) the clone\n    \\*/\n    function fixids(el) {\n        var els = el.selectAll(\"*\"),\n            it,\n            url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n            ids = [],\n            uses = {};\n        function urltest(it, name) {\n            var val = $(it.node, name);\n            val = val && val.match(url);\n            val = val && val[2];\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    var attr = {};\n                    attr[name] = URL(id);\n                    $(it.node, attr);\n                });\n            }\n        }\n        function linktest(it) {\n            var val = $(it.node, \"xlink:href\");\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    it.attr(\"xlink:href\", \"#\" + id);\n                });\n            }\n        }\n        for (var i = 0, ii = els.length; i < ii; i++) {\n            it = els[i];\n            urltest(it, \"fill\");\n            urltest(it, \"stroke\");\n            urltest(it, \"filter\");\n            urltest(it, \"mask\");\n            urltest(it, \"clip-path\");\n            linktest(it);\n            var oldid = $(it.node, \"id\");\n            if (oldid) {\n                $(it.node, {id: it.id});\n                ids.push({\n                    old: oldid,\n                    id: it.id\n                });\n            }\n        }\n        for (i = 0, ii = ids.length; i < ii; i++) {\n            var fs = uses[ids[i].old];\n            if (fs) {\n                for (var j = 0, jj = fs.length; j < jj; j++) {\n                    fs[j](ids[i].id);\n                }\n            }\n        }\n    }\n    elproto.clone = function () {\n        var clone = wrap(this.node.cloneNode(true));\n        if ($(clone.node, \"id\")) {\n            $(clone.node, {id: clone.id});\n        }\n        fixids(clone);\n        clone.insertAfter(this);\n        return clone;\n    };\n// SIERRA Element.toDefs(): If this _moves_ an element to the <defs> region, why is the return value a _clone_? Also unclear why it's called the _relative_ <defs> section. Perhaps _shared_?\n    /*\\\n     * Element.toDefs\n     [ method ]\n     **\n     * Moves element to the shared `<defs>` area\n     **\n     = (Element) the clone\n    \\*/\n    elproto.toDefs = function () {\n        var defs = getSomeDefs(this);\n        defs.appendChild(this.node);\n        return this;\n    };\n// SIERRA Element.pattern(): x/y/width/height data types are listed as both String and Number. Is that an error, or does it mean strings are coerced?\n// SIERRA Element.pattern(): clarify that x/y are offsets that e.g., may add gutters between the tiles.\n    /*\\\n     * Element.pattern\n     [ method ]\n     **\n     * Creates a `<pattern>` element from the current element\n     **\n     * To create a pattern you have to specify the pattern rect:\n     - x (string|number)\n     - y (string|number)\n     - width (string|number)\n     - height (string|number)\n     = (Element) the `<pattern>` element\n     * You can use pattern later on as an argument for `fill` attribute:\n     | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n     |         fill: \"none\",\n     |         stroke: \"#bada55\",\n     |         strokeWidth: 5\n     |     }).pattern(0, 0, 10, 10),\n     |     c = paper.circle(200, 200, 100);\n     | c.attr({\n     |     fill: p\n     | });\n    \\*/\n    elproto.pattern = function (x, y, width, height) {\n        var p = make(\"pattern\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        $(p.node, {\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            patternUnits: \"userSpaceOnUse\",\n            id: p.id,\n            viewBox: [x, y, width, height].join(\" \")\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values.  Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where?  Couldn't they also be assigned default values?\n    /*\\\n     * Element.marker\n     [ method ]\n     **\n     * Creates a `<marker>` element from the current element\n     **\n     * To create a marker you have to specify the bounding rect and reference point:\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - refX (number)\n     - refY (number)\n     = (Element) the `<marker>` element\n     * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n    \\*/\n    // TODO add usage for markers\n    elproto.marker = function (x, y, width, height, refX, refY) {\n        var p = make(\"marker\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            refX = x.refX || x.cx;\n            refY = x.refY || x.cy;\n            x = x.x;\n        }\n        $(p.node, {\n            viewBox: [x, y, width, height].join(S),\n            markerWidth: width,\n            markerHeight: height,\n            orient: \"auto\",\n            refX: refX || 0,\n            refY: refY || 0,\n            id: p.id\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n    // animation\n    function slice(from, to, f) {\n        return function (arr) {\n            var res = arr.slice(from, to);\n            if (res.length == 1) {\n                res = res[0];\n            }\n            return f ? f(res) : res;\n        };\n    }\n    var Animation = function (attr, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        this.attr = attr;\n        this.dur = ms;\n        easing && (this.easing = easing);\n        callback && (this.callback = callback);\n    };\n    // SIERRA All object methods should feature sample code. This is just one instance.\n    /*\\\n     * Snap.animation\n     [ method ]\n     **\n     * Creates an animation object\n     **\n     - attr (object) attributes of final destination\n     - duration (number) duration of the animation, in milliseconds\n     - easing (function) #optional one of easing functions of @mina or custom one\n     - callback (function) #optional callback function that fires when animation ends\n     = (object) animation object\n    \\*/\n    Snap.animation = function (attr, ms, easing, callback) {\n        return new Animation(attr, ms, easing, callback);\n    };\n    /*\\\n     * Element.inAnim\n     [ method ]\n     **\n     * Returns a set of animations that may be able to manipulate the current element\n     **\n     = (object) in format:\n     o {\n     o     anim (object) animation object,\n     o     curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    elproto.inAnim = function () {\n        var el = this,\n            res = [];\n        for (var id in el.anims) if (el.anims[has](id)) {\n            (function (a) {\n                res.push({\n                    anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n                    curStatus: a.status(),\n                    status: function (val) {\n                        return a.status(val);\n                    },\n                    stop: function () {\n                        a.stop();\n                    }\n                });\n            }(el.anims[id]));\n        }\n        return res;\n    };\n    /*\\\n     * Snap.animate\n     [ method ]\n     **\n     * Runs generic animation of one number into another with a caring function\n     **\n     - from (number|array) number or array of numbers\n     - to (number|array) number or array of numbers\n     - setter (function) caring function that accepts one number argument\n     - duration (number) duration, in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function to execute when animation ends\n     = (object) animation object in @mina format\n     o {\n     o     id (string) animation id, consider it read-only,\n     o     duration (function) gets or sets the duration of the animation,\n     o     easing (function) easing,\n     o     speed (function) gets or sets the speed of the animation,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n     | var rect = Snap().rect(0, 0, 10, 10);\n     | Snap.animate(0, 10, function (val) {\n     |     rect.attr({\n     |         x: val\n     |     });\n     | }, 1000);\n     | // in given context is equivalent to\n     | rect.animate({x: 10}, 1000);\n    \\*/\n    Snap.animate = function (from, to, setter, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        var now = mina.time(),\n            anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n        callback && eve.once(\"mina.finish.\" + anim.id, callback);\n        return anim;\n    };\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops all the animations for the current element\n     **\n     = (Element) the current element\n    \\*/\n    elproto.stop = function () {\n        var anims = this.inAnim();\n        for (var i = 0, ii = anims.length; i < ii; i++) {\n            anims[i].stop();\n        }\n        return this;\n    };\n    // SIERRA Element.animate(): For _attrs_, clarify if they represent the destination values, and if the animation executes relative to the element's current attribute values.\n    // SIERRA would a _custom_ animation function be an SVG keySplines value?\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Animates the given attributes of the element\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     = (Element) the current element\n    \\*/\n    elproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = easing.dur;\n            attrs = attrs.attr;\n        }\n        var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n            el = this;\n        for (var key in attrs) if (attrs[has](key)) {\n            if (el.equal) {\n                eq = el.equal(key, Str(attrs[key]));\n                from = eq.from;\n                to = eq.to;\n                f = eq.f;\n            } else {\n                from = +el.attr(key);\n                to = +attrs[key];\n            }\n            var len = is(from, \"array\") ? from.length : 1;\n            keys[key] = slice(fkeys.length, fkeys.length + len, f);\n            fkeys = fkeys.concat(from);\n            tkeys = tkeys.concat(to);\n        }\n        var now = mina.time(),\n            anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n                var attr = {};\n                for (var key in keys) if (keys[has](key)) {\n                    attr[key] = keys[key](val);\n                }\n                el.attr(attr);\n            }, easing);\n        el.anims[anim.id] = anim;\n        anim._attrs = attrs;\n        anim._callback = callback;\n        eve.once(\"mina.finish.\" + anim.id, function () {\n            delete el.anims[anim.id];\n            callback && callback.call(el);\n        });\n        eve.once(\"mina.stop.\" + anim.id, function () {\n            delete el.anims[anim.id];\n        });\n        return el;\n    };\n    var eldata = {};\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key. (Don’t confuse\n     * with `data-` attributes)\n     *\n     * See also @Element.removeData\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 0){\n            eve(\"snap.data.get.\" + this.id, this, data, null);\n            return data;\n        }\n        if (arguments.length == 1) {\n            if (Snap.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"snap.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"snap.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            eldata[this.id] = {};\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n    /*\\\n     * Element.outerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n     *\n     * See also @Element.innerSVG\n     = (string) SVG code for the element\n    \\*/\n    /*\\\n     * Element.toString\n     [ method ]\n     **\n     * See @Element.outerSVG\n    \\*/\n    elproto.outerSVG = elproto.toString = toString(1);\n    /*\\\n     * Element.innerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.innerSVG = toString();\n    function toString(type) {\n        return function () {\n            var res = type ? \"<\" + this.type : \"\",\n                attr = this.node.attributes,\n                chld = this.node.childNodes;\n            if (type) {\n                for (var i = 0, ii = attr.length; i < ii; i++) {\n                    res += \" \" + attr[i].name + '=\"' +\n                            attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n                }\n            }\n            if (chld.length) {\n                type && (res += \">\");\n                for (i = 0, ii = chld.length; i < ii; i++) {\n                    if (chld[i].nodeType == 3) {\n                        res += chld[i].nodeValue;\n                    } else if (chld[i].nodeType == 1) {\n                        res += wrap(chld[i]).toString();\n                    }\n                }\n                type && (res += \"</\" + this.type + \">\");\n            } else {\n                type && (res += \"/>\");\n            }\n            return res;\n        };\n    }\n}(Element.prototype));\n// SIERRA Snap.parse() accepts & returns a fragment, but there's no info on what it does in between. What if it doesn't parse?\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n    var f = glob.doc.createDocumentFragment(),\n        full = true,\n        div = glob.doc.createElement(\"div\");\n    svg = Str(svg);\n    if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n        svg = \"<svg>\" + svg + \"</svg>\";\n        full = false;\n    }\n    div.innerHTML = svg;\n    svg = div.getElementsByTagName(\"svg\")[0];\n    if (svg) {\n        if (full) {\n            f = svg;\n        } else {\n            while (svg.firstChild) {\n                f.appendChild(svg.firstChild);\n            }\n        }\n    }\n    div.innerHTML = E;\n    return new Fragment(f);\n};\nfunction Fragment(frag) {\n    this.node = frag;\n}\n/*\\\n * Fragment.select\n [ method ]\n **\n * See @Element.select\n\\*/\nFragment.prototype.select = Element.prototype.select;\n/*\\\n * Fragment.selectAll\n [ method ]\n **\n * See @Element.selectAll\n\\*/\nFragment.prototype.selectAll = Element.prototype.selectAll;\n// SIERRA Snap.fragment() could especially use a code example\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n    var args = Array.prototype.slice.call(arguments, 0),\n        f = glob.doc.createDocumentFragment();\n    for (var i = 0, ii = args.length; i < ii; i++) {\n        var item = args[i];\n        if (item.node && item.node.nodeType) {\n            f.appendChild(item.node);\n        }\n        if (item.nodeType) {\n            f.appendChild(item);\n        }\n        if (typeof item == \"string\") {\n            f.appendChild(Snap.parse(item).node);\n        }\n    }\n    return new Fragment(f);\n};\n\nfunction make(name, parent) {\n    var res = $(name);\n    parent.appendChild(res);\n    var el = wrap(res);\n    el.type = name;\n    return el;\n}\nfunction Paper(w, h) {\n    var res,\n        desc,\n        defs,\n        proto = Paper.prototype;\n    if (w && w.tagName == \"svg\") {\n        if (w.snap in hub) {\n            return hub[w.snap];\n        }\n        res = new Element(w);\n        desc = w.getElementsByTagName(\"desc\")[0];\n        defs = w.getElementsByTagName(\"defs\")[0];\n        if (!desc) {\n            desc = $(\"desc\");\n            desc.appendChild(glob.doc.createTextNode(\"Created with Snap\"));\n            res.node.appendChild(desc);\n        }\n        if (!defs) {\n            defs = $(\"defs\");\n            res.node.appendChild(defs);\n        }\n        res.defs = defs;\n        for (var key in proto) if (proto[has](key)) {\n            res[key] = proto[key];\n        }\n        res.paper = res.root = res;\n    } else {\n        res = make(\"svg\", glob.doc.body);\n        $(res.node, {\n            height: h,\n            version: 1.1,\n            width: w,\n            xmlns: xmlns\n        });\n    }\n    return res;\n}\nfunction wrap(dom) {\n    if (!dom) {\n        return dom;\n    }\n    if (dom instanceof Element || dom instanceof Fragment) {\n        return dom;\n    }\n    if (dom.tagName == \"svg\") {\n        return new Paper(dom);\n    }\n    return new Element(dom);\n}\n// gradients' helpers\nfunction Gstops() {\n    return this.selectAll(\"stop\");\n}\nfunction GaddStop(color, offset) {\n    var stop = $(\"stop\"),\n        attr = {\n            offset: +offset + \"%\"\n        };\n    color = Snap.color(color);\n    attr[\"stop-color\"] = color.hex;\n    if (color.opacity < 1) {\n        attr[\"stop-opacity\"] = color.opacity;\n    }\n    $(stop, attr);\n    this.node.appendChild(stop);\n    return this;\n}\nfunction GgetBBox() {\n    if (this.type == \"linearGradient\") {\n        var x1 = $(this.node, \"x1\") || 0,\n            x2 = $(this.node, \"x2\") || 1,\n            y1 = $(this.node, \"y1\") || 0,\n            y2 = $(this.node, \"y2\") || 0;\n        return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n    } else {\n        var cx = this.node.cx || .5,\n            cy = this.node.cy || .5,\n            r = this.node.r || 0;\n        return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n    }\n}\nfunction gradient(defs, str) {\n    var grad = arrayFirstValue(eve(\"snap.util.grad.parse\", null, str)),\n        el;\n    if (!grad) {\n        return null;\n    }\n    grad.params.unshift(defs);\n    if (grad.type.toLowerCase() == \"l\") {\n        el = gradientLinear.apply(0, grad.params);\n    } else {\n        el = gradientRadial.apply(0, grad.params);\n    }\n    if (grad.type != grad.type.toLowerCase()) {\n        $(el.node, {\n            gradientUnits: \"userSpaceOnUse\"\n        });\n    }\n    var stops = grad.stops,\n        len = stops.length,\n        start = 0,\n        j = 0;\n    function seed(i, end) {\n        var step = (end - start) / (i - j);\n        for (var k = j; k < i; k++) {\n            stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n        }\n        j = i;\n        start = end;\n    }\n    len--;\n    for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n        seed(i, stops[i].offset);\n    }\n    stops[len].offset = stops[len].offset || 100;\n    seed(len, stops[len].offset);\n    for (i = 0; i <= len; i++) {\n        var stop = stops[i];\n        el.addStop(stop.color, stop.offset);\n    }\n    return el;\n}\nfunction gradientLinear(defs, x1, y1, x2, y2) {\n    var el = make(\"linearGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (x1 != null) {\n        $(el.node, {\n            x1: x1,\n            y1: y1,\n            x2: x2,\n            y2: y2\n        });\n    }\n    return el;\n}\nfunction gradientRadial(defs, cx, cy, r, fx, fy) {\n    var el = make(\"radialGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (cx != null) {\n        $(el.node, {\n            cx: cx,\n            cy: cy,\n            r: r\n        });\n    }\n    if (fx != null && fy != null) {\n        $(el.node, {\n            fx: fx,\n            fy: fy\n        });\n    }\n    return el;\n}\n// Paper prototype methods\n(function (proto) {\n    /*\\\n     * Paper.el\n     [ method ]\n     **\n     * Creates an element on paper with a given name and no attributes\n     **\n     - name (string) tag name\n     - attr (object) attributes\n     = (Element) the current element\n     > Usage\n     | var c = paper.circle(10, 10, 10); // is the same as...\n     | var c = paper.el(\"circle\").attr({\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n     | // and the same as\n     | var c = paper.el(\"circle\", {\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n    \\*/\n    proto.el = function (name, attr) {\n        return make(name, this.node).attr(attr);\n    };\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - rx (number) #optional horizontal radius for rounded corners, default is 0\n     - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n     = (object) the `rect` element\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    proto.rect = function (x, y, w, h, rx, ry) {\n        var attr;\n        if (ry == null) {\n            ry = rx;\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                width: w,\n                height: h\n            };\n            if (rx != null) {\n                attr.rx = rx;\n                attr.ry = ry;\n            }\n        }\n        return this.el(\"rect\", attr);\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) the `circle` element\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    proto.circle = function (cx, cy, r) {\n        var attr;\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            attr = cx;\n        } else if (cx != null) {\n            attr = {\n                cx: cx,\n                cy: cy,\n                r: r\n            };\n        }\n        return this.el(\"circle\", attr);\n    };\n\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Places an image on the surface\n     **\n     - src (string) URI of the source image\n     - x (number) x offset position\n     - y (number) y offset position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) the `image` element\n     * or\n     = (object) Snap element object with type `image`\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    proto.image = function (src, x, y, width, height) {\n        var el = make(\"image\", this.node);\n        if (is(src, \"object\") && \"src\" in src) {\n            el.attr(src);\n        } else if (src != null) {\n            var set = {\n                \"xlink:href\": src,\n                preserveAspectRatio: \"none\"\n            };\n            if (x != null && y != null) {\n                set.x = x;\n                set.y = y;\n            }\n            if (width != null && height != null) {\n                set.width = width;\n                set.height = height;\n            } else {\n                preload(src, function () {\n                    $(el.node, {\n                        width: this.offsetWidth,\n                        height: this.offsetHeight\n                    });\n                });\n            }\n            $(el.node, set);\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) the `ellipse` element\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    proto.ellipse = function (cx, cy, rx, ry) {\n        var el = make(\"ellipse\", this.node);\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            el.attr(cx);\n        } else if (cx != null) {\n            el.attr({\n                cx: cx,\n                cy: cy,\n                rx: rx,\n                ry: ry\n            });\n        }\n        return el;\n    };\n    // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a `<path>` element using the given string as the path's definition\n     - pathString (string) #optional path string in SVG format\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n     | \"M10,20L30,40\"\n     * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n     * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n    \\*/\n    proto.path = function (d) {\n        var el = make(\"path\", this.node);\n        if (is(d, \"object\") && !is(d, \"array\")) {\n            el.attr(d);\n        } else if (d) {\n            el.attr({\n                d: d\n            });\n        }\n        return el;\n    };\n// SIERRA Paper.g(): Don't understand the code comment about the order being _different._ Wouldn't it be a rect followed by a circle?\n    /*\\\n     * Paper.g\n     [ method ]\n     **\n     * Creates a group element\n     **\n     - varargs (…) #optional elements to nest within the group\n     = (object) the `g` element\n     **\n     > Usage\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g(c2, c1); // note that the order of elements is different\n     * or\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g();\n     | g.add(c2, c1);\n    \\*/\n    /*\\\n     * Paper.group\n     [ method ]\n     **\n     * See @Paper.g\n    \\*/\n    proto.group = proto.g = function (first) {\n        var el = make(\"g\", this.node);\n        el.add = add2group;\n        for (var method in proto) if (proto[has](method)) {\n            el[method] = proto[method];\n        }\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string|array) The text string to draw or array of strings to nest within separate `<tspan>` elements\n     = (object) the `text` element\n     **\n     > Usage\n     | var t1 = paper.text(50, 50, \"Snap\");\n     | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n     | // Text path usage\n     | t1.attr({textpath: \"M10,10L100,100\"});\n     | // or\n     | var pth = paper.path(\"M10,10L100,100\");\n     | t1.attr({textpath: pth});\n    \\*/\n    proto.text = function (x, y, text) {\n        var el = make(\"text\", this.node);\n        if (is(x, \"object\")) {\n            el.attr(x);\n        } else if (x != null) {\n            el.attr({\n                x: x,\n                y: y,\n                text: text || \"\"\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.line\n     [ method ]\n     **\n     * Draws a line\n     **\n     - x1 (number) x coordinate position of the start\n     - y1 (number) y coordinate position of the start\n     - x2 (number) x coordinate position of the end\n     - y2 (number) y coordinate position of the end\n     = (object) the `line` element\n     **\n     > Usage\n     | var t1 = paper.line(50, 50, 100, 100);\n    \\*/\n    proto.line = function (x1, y1, x2, y2) {\n        var el = make(\"line\", this.node);\n        if (is(x1, \"object\")) {\n            el.attr(x1);\n        } else if (x1 != null) {\n            el.attr({\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polyline\n     [ method ]\n     **\n     * Draws a polyline\n     **\n     - points (array) array of points\n     * or\n     - varargs (…) points\n     = (object) the `polyline` element\n     **\n     > Usage\n     | var p1 = paper.polyline([10, 10, 100, 100]);\n     | var p2 = paper.polyline(10, 10, 100, 100);\n    \\*/\n    proto.polyline = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polyline\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polygon\n     [ method ]\n     **\n     * Draws a polygon. See @Paper.polyline\n    \\*/\n    proto.polygon = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polygon\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    // gradients\n    (function () {\n        /*\\\n         * Paper.gradient\n         [ method ]\n         **\n         * Creates a gradient element\n         **\n         - gradient (string) gradient descriptor\n         > Gradient Descriptor\n         * The gradient descriptor is an expression formatted as\n         * follows: `<type>(<coords>)<colors>`.  The `<type>` can be\n         * either linear or radial.  The uppercase `L` or `R` letters\n         * indicate absolute coordinates offset from the SVG surface.\n         * Lowercase `l` or `r` letters indicate coordinates\n         * calculated relative to the element to which the gradient is\n         * applied.  Coordinates specify a linear gradient vector as\n         * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n         * `r` and optional `fx`, `fy` specifying a focal point away\n         * from the center of the circle. Specify `<colors>` as a list\n         * of dash-separated CSS color values.  Each color may be\n         * followed by a custom offset value, separated with a colon\n         * character.\n         > Examples\n         * Linear gradient, relative from top-left corner to bottom-right\n         * corner, from black through red to white:\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         * Linear gradient, absolute from (0, 0) to (100, 100), from black\n         * through red at 25% to white:\n         | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25%-#fff\");\n         * Radial gradient, relative from the center of the element with radius\n         * half the width, from black to white:\n         | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n         * To apply the gradient:\n         | paper.circle(50, 50, 40).attr({\n         |     fill: g\n         | });\n         = (object) the `gradient` element\n        \\*/\n        proto.gradient = function (str) {\n            return gradient(this.defs, str);\n        };\n        proto.gradientLinear = function (x1, y1, x2, y2) {\n            return gradientLinear(this.defs, x1, y1, x2, y2);\n        };\n        proto.gradientRadial = function (cx, cy, r, fx, fy) {\n            return gradientRadial(this.defs, cx, cy, r, fx, fy);\n        };\n        /*\\\n         * Paper.toString\n         [ method ]\n         **\n         * Returns SVG code for the @Paper\n         = (string) SVG code for the @Paper\n        \\*/\n        proto.toString = function () {\n            var f = glob.doc.createDocumentFragment(),\n                d = glob.doc.createElement(\"div\"),\n                svg = this.node.cloneNode(true),\n                res;\n            f.appendChild(d);\n            d.appendChild(svg);\n            $(svg, {xmlns: xmlns});\n            res = d.innerHTML;\n            f.removeChild(f.firstChild);\n            return res;\n        };\n        /*\\\n         * Paper.clear\n         [ method ]\n         **\n         * Removes all child nodes of the paper, except <defs>.\n        \\*/\n        proto.clear = function () {\n            var node = this.node.firstChild,\n                next;\n            while (node) {\n                next = node.nextSibling;\n                if (node.tagName != \"defs\") {\n                    node.parentNode.removeChild(node);\n                }\n                node = next;\n            }\n        };\n    }());\n}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n    var req = new XMLHttpRequest,\n        id = ID();\n    if (req) {\n        if (is(postData, \"function\")) {\n            scope = callback;\n            callback = postData;\n            postData = null;\n        } else if (is(postData, \"object\")) {\n            var pd = [];\n            for (var key in postData) if (postData.hasOwnProperty(key)) {\n                pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n            }\n            postData = pd.join(\"&\");\n        }\n        req.open((postData ? \"POST\" : \"GET\"), url, true);\n        req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n        if (postData) {\n            req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n        }\n        if (callback) {\n            eve.once(\"snap.ajax.\" + id + \".0\", callback);\n            eve.once(\"snap.ajax.\" + id + \".200\", callback);\n            eve.once(\"snap.ajax.\" + id + \".304\", callback);\n        }\n        req.onreadystatechange = function() {\n            if (req.readyState != 4) return;\n            eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n        };\n        if (req.readyState == 4) {\n            return req;\n        }\n        req.send(postData);\n        return req;\n    }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n    Snap.ajax(url, function (req) {\n        var f = Snap.parse(req.responseText);\n        scope ? callback.call(scope, f) : callback(f);\n    });\n};\n\n// Attributes event handlers\neve.on(\"snap.util.attr.mask\", function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value.type == \"mask\") {\n            var mask = value;\n        } else {\n            mask = make(\"mask\", getSomeDefs(this));\n            mask.node.appendChild(value.node);\n            !mask.node.id && $(mask.node, {\n                id: mask.id\n            });\n        }\n        $(this.node, {\n            mask: URL(mask.id)\n        });\n    }\n});\n(function (clipIt) {\n    eve.on(\"snap.util.attr.clip\", clipIt);\n    eve.on(\"snap.util.attr.clip-path\", clipIt);\n    eve.on(\"snap.util.attr.clipPath\", clipIt);\n}(function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value.type == \"clipPath\") {\n            var clip = value;\n        } else {\n            clip = make(\"clipPath\", getSomeDefs(this));\n            clip.node.appendChild(value.node);\n            !clip.node.id && $(clip.node, {\n                id: clip.id\n            });\n        }\n        $(this.node, {\n            \"clip-path\": URL(clip.id)\n        });\n    }\n}));\nfunction fillStroke(name) {\n    return function (value) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n            (value.node.firstChild.tagName == \"radialGradient\" ||\n            value.node.firstChild.tagName == \"linearGradient\" ||\n            value.node.firstChild.tagName == \"pattern\")) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value instanceof Element) {\n            if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n               || value.type == \"pattern\") {\n                if (!value.node.id) {\n                    $(value.node, {\n                        id: value.id\n                    });\n                }\n                var fill = URL(value.node.id);\n            } else {\n                fill = value.attr(name);\n            }\n        } else {\n            fill = Snap.color(value);\n            if (fill.error) {\n                var grad = gradient(getSomeDefs(this), value);\n                if (grad) {\n                    if (!grad.node.id) {\n                        $(grad.node, {\n                            id: grad.id\n                        });\n                    }\n                    fill = URL(grad.node.id);\n                } else {\n                    fill = value;\n                }\n            } else {\n                fill = Str(fill);\n            }\n        }\n        var attrs = {};\n        attrs[name] = fill;\n        $(this.node, attrs);\n        this.node.style[name] = E;\n    };\n}\neve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\neve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\nvar gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\neve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n    string = Str(string);\n    var tokens = string.match(gradrg);\n    if (!tokens) {\n        return null;\n    }\n    var type = tokens[1],\n        params = tokens[2],\n        stops = tokens[3];\n    params = params.split(/\\s*,\\s*/).map(function (el) {\n        return +el == el ? +el : el;\n    });\n    if (params.length == 1 && params[0] == 0) {\n        params = [];\n    }\n    stops = stops.split(\"-\");\n    stops = stops.map(function (el) {\n        el = el.split(\":\");\n        var out = {\n            color: el[0]\n        };\n        if (el[1]) {\n            out.offset = el[1];\n        }\n        return out;\n    });\n    return {\n        type: type,\n        params: params,\n        stops: stops\n    };\n});\n\neve.on(\"snap.util.attr.d\", function (value) {\n    eve.stop();\n    if (is(value, \"array\") && is(value[0], \"array\")) {\n        value = Snap.path.toString.call(value);\n    }\n    value = Str(value);\n    if (value.match(/[ruo]/i)) {\n        value = Snap.path.toAbsolute(value);\n    }\n    $(this.node, {d: value});\n})(-1);\neve.on(\"snap.util.attr.#text\", function (value) {\n    eve.stop();\n    value = Str(value);\n    var txt = glob.doc.createTextNode(value);\n    while (this.node.firstChild) {\n        this.node.removeChild(this.node.firstChild);\n    }\n    this.node.appendChild(txt);\n})(-1);\neve.on(\"snap.util.attr.path\", function (value) {\n    eve.stop();\n    this.attr({d: value});\n})(-1);\neve.on(\"snap.util.attr.viewBox\", function (value) {\n    var vb;\n    if (is(value, \"object\") && \"x\" in value) {\n        vb = [value.x, value.y, value.width, value.height].join(\" \");\n    } else if (is(value, \"array\")) {\n        vb = value.join(\" \");\n    } else {\n        vb = value;\n    }\n    $(this.node, {\n        viewBox: vb\n    });\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.transform\", function (value) {\n    this.transform(value);\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.r\", function (value) {\n    if (this.type == \"rect\") {\n        eve.stop();\n        $(this.node, {\n            rx: value,\n            ry: value\n        });\n    }\n})(-1);\neve.on(\"snap.util.attr.textpath\", function (value) {\n    eve.stop();\n    if (this.type == \"text\") {\n        var id, tp, node;\n        if (!value && this.textPath) {\n            tp = this.textPath;\n            while (tp.node.firstChild) {\n                this.node.appendChild(tp.node.firstChild);\n            }\n            tp.remove();\n            delete this.textPath;\n            return;\n        }\n        if (is(value, \"string\")) {\n            var defs = getSomeDefs(this),\n                path = wrap(defs.parentNode).path(value);\n            defs.appendChild(path.node);\n            id = path.id;\n            path.attr({id: id});\n        } else {\n            value = wrap(value);\n            if (value instanceof Element) {\n                id = value.attr(\"id\");\n                if (!id) {\n                    id = value.id;\n                    value.attr({id: id});\n                }\n            }\n        }\n        if (id) {\n            tp = this.textPath;\n            node = this.node;\n            if (tp) {\n                tp.attr({\"xlink:href\": \"#\" + id});\n            } else {\n                tp = $(\"textPath\", {\n                    \"xlink:href\": \"#\" + id\n                });\n                while (node.firstChild) {\n                    tp.appendChild(node.firstChild);\n                }\n                node.appendChild(tp);\n                this.textPath = wrap(tp);\n            }\n        }\n    }\n})(-1);\neve.on(\"snap.util.attr.text\", function (value) {\n    if (this.type == \"text\") {\n        var i = 0,\n            node = this.node,\n            tuner = function (chunk) {\n                var out = $(\"tspan\");\n                if (is(chunk, \"array\")) {\n                    for (var i = 0; i < chunk.length; i++) {\n                        out.appendChild(tuner(chunk[i]));\n                    }\n                } else {\n                    out.appendChild(glob.doc.createTextNode(chunk));\n                }\n                out.normalize && out.normalize();\n                return out;\n            };\n        while (node.firstChild) {\n            node.removeChild(node.firstChild);\n        }\n        var tuned = tuner(value);\n        while (tuned.firstChild) {\n            node.appendChild(tuned.firstChild);\n        }\n    }\n    eve.stop();\n})(-1);\n// default\nvar cssAttr = {\n    \"alignment-baseline\": 0,\n    \"baseline-shift\": 0,\n    \"clip\": 0,\n    \"clip-path\": 0,\n    \"clip-rule\": 0,\n    \"color\": 0,\n    \"color-interpolation\": 0,\n    \"color-interpolation-filters\": 0,\n    \"color-profile\": 0,\n    \"color-rendering\": 0,\n    \"cursor\": 0,\n    \"direction\": 0,\n    \"display\": 0,\n    \"dominant-baseline\": 0,\n    \"enable-background\": 0,\n    \"fill\": 0,\n    \"fill-opacity\": 0,\n    \"fill-rule\": 0,\n    \"filter\": 0,\n    \"flood-color\": 0,\n    \"flood-opacity\": 0,\n    \"font\": 0,\n    \"font-family\": 0,\n    \"font-size\": 0,\n    \"font-size-adjust\": 0,\n    \"font-stretch\": 0,\n    \"font-style\": 0,\n    \"font-variant\": 0,\n    \"font-weight\": 0,\n    \"glyph-orientation-horizontal\": 0,\n    \"glyph-orientation-vertical\": 0,\n    \"image-rendering\": 0,\n    \"kerning\": 0,\n    \"letter-spacing\": 0,\n    \"lighting-color\": 0,\n    \"marker\": 0,\n    \"marker-end\": 0,\n    \"marker-mid\": 0,\n    \"marker-start\": 0,\n    \"mask\": 0,\n    \"opacity\": 0,\n    \"overflow\": 0,\n    \"pointer-events\": 0,\n    \"shape-rendering\": 0,\n    \"stop-color\": 0,\n    \"stop-opacity\": 0,\n    \"stroke\": 0,\n    \"stroke-dasharray\": 0,\n    \"stroke-dashoffset\": 0,\n    \"stroke-linecap\": 0,\n    \"stroke-linejoin\": 0,\n    \"stroke-miterlimit\": 0,\n    \"stroke-opacity\": 0,\n    \"stroke-width\": 0,\n    \"text-anchor\": 0,\n    \"text-decoration\": 0,\n    \"text-rendering\": 0,\n    \"unicode-bidi\": 0,\n    \"visibility\": 0,\n    \"word-spacing\": 0,\n    \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n    var att = eve.nt(),\n        attr = {};\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    attr[att] = value;\n    var style = att.replace(/-(\\w)/gi, function (all, letter) {\n            return letter.toUpperCase();\n        }),\n        css = att.replace(/[A-Z]/g, function (letter) {\n            return \"-\" + letter.toLowerCase();\n        });\n    if (cssAttr[has](css)) {\n        this.node.style[style] = value == null ? E : value;\n    } else {\n        $(this.node, attr);\n    }\n});\neve.on(\"snap.util.getattr.transform\", function () {\n    eve.stop();\n    return this.transform();\n})(-1);\neve.on(\"snap.util.getattr.textpath\", function () {\n    eve.stop();\n    return this.textPath;\n})(-1);\n// Markers\n(function () {\n    function getter(end) {\n        return function () {\n            eve.stop();\n            var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n            if (style == \"none\") {\n                return style;\n            } else {\n                return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n            }\n        };\n    }\n    function setter(end) {\n        return function (value) {\n            eve.stop();\n            var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n            if (value == \"\" || !value) {\n                this.node.style[name] = \"none\";\n                return;\n            }\n            if (value.type == \"marker\") {\n                var id = value.node.id;\n                if (!id) {\n                    $(value.node, {id: value.id});\n                }\n                this.node.style[name] = URL(id);\n                return;\n            }\n        };\n    }\n    eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n}());\neve.on(\"snap.util.getattr.r\", function () {\n    if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n        eve.stop();\n        return $(this.node, \"rx\");\n    }\n})(-1);\nfunction textExtract(node) {\n    var out = [];\n    var children = node.childNodes;\n    for (var i = 0, ii = children.length; i < ii; i++) {\n        var chi = children[i];\n        if (chi.nodeType == 3) {\n            out.push(chi.nodeValue);\n        }\n        if (chi.tagName == \"tspan\") {\n            if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n                out.push(chi.firstChild.nodeValue);\n            } else {\n                out.push(textExtract(chi));\n            }\n        }\n    }\n    return out;\n}\neve.on(\"snap.util.getattr.text\", function () {\n    if (this.type == \"text\" || this.type == \"tspan\") {\n        eve.stop();\n        var out = textExtract(this.node);\n        return out.length == 1 ? out[0] : out;\n    }\n})(-1);\neve.on(\"snap.util.getattr.#text\", function () {\n    return this.node.textContent;\n})(-1);\neve.on(\"snap.util.getattr.viewBox\", function () {\n    eve.stop();\n    var vb = $(this.node, \"viewBox\").split(separator);\n    return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n    // TODO: investigate why I need to z-index it\n})(-1);\neve.on(\"snap.util.getattr.points\", function () {\n    var p = $(this.node, \"points\");\n    eve.stop();\n    return p.split(separator);\n});\neve.on(\"snap.util.getattr.path\", function () {\n    var p = $(this.node, \"d\");\n    eve.stop();\n    return p;\n});\n// default\neve.on(\"snap.util.getattr\", function () {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    var css = att.replace(/[A-Z]/g, function (letter) {\n        return \"-\" + letter.toLowerCase();\n    });\n    if (cssAttr[has](css)) {\n        return glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n    } else {\n        return $(this.node, att);\n    }\n});\nvar getOffset = function (elem) {\n    var box = elem.getBoundingClientRect(),\n        doc = elem.ownerDocument,\n        body = doc.body,\n        docElem = doc.documentElement,\n        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n        top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n        left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n    return {\n        y: top,\n        x: left\n    };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n    var paper = this,\n        svg = paper.canvas,\n        target = glob.doc.elementFromPoint(x, y);\n    if (glob.win.opera && target.tagName == \"svg\") {\n        var so = getOffset(target),\n            sr = target.createSVGRect();\n        sr.x = x - so.x;\n        sr.y = y - so.y;\n        sr.width = sr.height = 1;\n        var hits = target.getIntersectionList(sr, null);\n        if (hits.length) {\n            target = hits[hits.length - 1];\n        }\n    }\n    if (!target) {\n        return null;\n    }\n    return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with four arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global) {\n |     Snap.newmethod = function () {};\n |     Element.prototype.newmethod = function () {};\n |     Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n    f(Snap, Element, Paper, glob);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}());\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        clone = Snap._.clone,\n        has = \"hasOwnProperty\",\n        p2s = /,?([a-z]),?/gi,\n        toFloat = parseFloat,\n        math = Math,\n        PI = math.PI,\n        mmin = math.min,\n        mmax = math.max,\n        pow = math.pow,\n        abs = math.abs;\n    function paths(ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    }\n    function box(x, y, width, height) {\n        if (x == null) {\n            x = y = width = height = 0;\n        }\n        if (y == null) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        return {\n            x: x,\n            y: y,\n            width: width,\n            w: width,\n            height: height,\n            h: height,\n            x2: x + width,\n            y2: y + height,\n            cx: x + width / 2,\n            cy: y + height / 2,\n            r1: math.min(width, height) / 2,\n            r2: math.max(width, height) / 2,\n            r0: math.sqrt(width * width + height * height) / 2,\n            path: rectPath(x, y, width, height),\n            vb: [x, y, width, height].join(\" \")\n        };\n    }\n    function toString() {\n        return this.join(\",\").replace(p2s, \"$1\");\n    }\n    function pathClone(pathArray) {\n        var res = clone(pathArray);\n        res.toString = toString;\n        return res;\n    }\n    function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n                getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    }\n    function getLengthFactory(istotal, subpath) {\n        function O(val) {\n            return +(+val).toFixed(3);\n        }\n        return Snap._.cacher(function (path, length, onlystart) {\n            if (path instanceof Element) {\n                path = path.attr(\"d\");\n            }\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\n                                \"C\" + O(point.start.x),\n                                O(point.start.y),\n                                O(point.m.x),\n                                O(point.m.y),\n                                O(point.x),\n                                O(point.y)\n                            ];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\n                                \"M\" + O(point.x),\n                                O(point.y) + \"C\" + O(point.n.x),\n                                O(point.n.y),\n                                O(point.end.x),\n                                O(point.end.y),\n                                O(p[5]),\n                                O(p[6])\n                            ].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return point;\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            return point;\n        }, null, Snap._.clone);\n    }\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\n        // (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    }\n    function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!Snap.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return box(\n            bbox.min.x,\n            bbox.min.y,\n            bbox.max.x - bbox.min.x,\n            bbox.max.y - bbox.min.y\n        );\n    }\n    function isPointInsideBBox(bbox, x, y) {\n        return  x >= bbox.x &&\n                x <= bbox.x + bbox.width &&\n                y >= bbox.y &&\n                y <= bbox.y + bbox.height;\n    }\n    function isBBoxIntersect(bbox1, bbox2) {\n        bbox1 = box(bbox1);\n        bbox2 = box(bbox2);\n        return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n                || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n                || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    }\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = bezierBBox(bez1),\n            bbox2 = bezierBBox(bez2);\n        if (!isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = ~~(l1 / 5),\n            n2 = ~~(l2 / 5),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: t1,\n                                t2: t2\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function pathIntersection(path1, path2) {\n        return interPathHelper(path1, path2);\n    }\n    function pathIntersectionNumber(path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    }\n    function interPathHelper(path1, path2, justCount) {\n        path1 = path2curve(path1);\n        path2 = path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function isPointInsidePath(path, x, y) {\n        var bbox = pathBBox(path);\n        return isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    }\n    function pathBBox(path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return box();\n        }\n        path = path2curve(path);\n        var x = 0, \n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X.concat(dim.min.x, dim.max.x);\n                Y = Y.concat(dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin.apply(0, X),\n            ymin = mmin.apply(0, Y),\n            xmax = mmax.apply(0, X),\n            ymax = mmax.apply(0, Y),\n            bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n        pth.bbox = clone(bb);\n        return bb;\n    }\n    function rectPath(x, y, w, h, r) {\n        if (r) {\n            return [\n                [\"M\", x + r, y],\n                [\"l\", w - r * 2, 0],\n                [\"a\", r, r, 0, 0, 1, r, r],\n                [\"l\", 0, h - r * 2],\n                [\"a\", r, r, 0, 0, 1, -r, r],\n                [\"l\", r * 2 - w, 0],\n                [\"a\", r, r, 0, 0, 1, -r, -r],\n                [\"l\", 0, r * 2 - h],\n                [\"a\", r, r, 0, 0, 1, r, -r],\n                [\"z\"]\n            ];\n        }\n        var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        res.toString = toString;\n        return res;\n    }\n    function ellipsePath(x, y, rx, ry, a) {\n        if (a == null && ry == null) {\n            ry = rx;\n        }\n        if (a != null) {\n            var rad = Math.PI / 180,\n                x1 = x + rx * Math.cos(-ry * rad),\n                x2 = x + rx * Math.cos(-a * rad),\n                y1 = y + rx * Math.sin(-ry * rad),\n                y2 = y + rx * Math.sin(-a * rad),\n                res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n        } else {\n            res = [\n                [\"M\", x, y],\n                [\"m\", 0, -ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n                [\"z\"]\n            ];\n        }\n        res.toString = toString;\n        return res;\n    }\n    var unit2px = Snap._unit2px,\n        getPath = {\n        path: function (el) {\n            return el.attr(\"path\");\n        },\n        circle: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.r);\n        },\n        ellipse: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.rx, attr.ry);\n        },\n        rect: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height, attr.rx, attr.ry);\n        },\n        image: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height);\n        },\n        text: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        g: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        symbol: function (el) {\n            var bbox = el.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        line: function (el) {\n            return \"M\" + [el.attr(\"x1\"), el.attr(\"y1\"), el.attr(\"x2\"), el.attr(\"y2\")];\n        },\n        polyline: function (el) {\n            return \"M\" + el.attr(\"points\");\n        },\n        polygon: function (el) {\n            return \"M\" + el.attr(\"points\") + \"z\";\n        },\n        svg: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        deflt: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        }\n    };\n    function pathToRelative(pathArray) {\n        var pth = paths(pathArray),\n            lowerCase = String.prototype.toLowerCase;\n        if (pth.rel) {\n            return pathClone(pth.rel);\n        }\n        if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0;\n        if (pathArray[0][0] == \"M\") {\n            x = pathArray[0][1];\n            y = pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res.push([\"M\", x, y]);\n        }\n        for (var i = start, ii = pathArray.length; i < ii; i++) {\n            var r = res[i] = [],\n                pa = pathArray[i];\n            if (pa[0] != lowerCase.call(pa[0])) {\n                r[0] = lowerCase.call(pa[0]);\n                switch (r[0]) {\n                    case \"a\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] - x).toFixed(3);\n                        r[7] = +(pa[7] - y).toFixed(3);\n                        break;\n                    case \"v\":\n                        r[1] = +(pa[1] - y).toFixed(3);\n                        break;\n                    case \"m\":\n                        mx = pa[1];\n                        my = pa[2];\n                    default:\n                        for (var j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\n                        }\n                }\n            } else {\n                r = res[i] = [];\n                if (pa[0] == \"m\") {\n                    mx = pa[1] + x;\n                    my = pa[2] + y;\n                }\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    res[i][k] = pa[k];\n                }\n            }\n            var len = res[i].length;\n            switch (res[i][0]) {\n                case \"z\":\n                    x = mx;\n                    y = my;\n                    break;\n                case \"h\":\n                    x += +res[i][len - 1];\n                    break;\n                case \"v\":\n                    y += +res[i][len - 1];\n                    break;\n                default:\n                    x += +res[i][len - 2];\n                    y += +res[i][len - 1];\n            }\n        }\n        res.toString = toString;\n        pth.rel = pathClone(res);\n        return res;\n    }\n    function pathToAbsolute(pathArray) {\n        var pth = paths(pathArray);\n        if (pth.abs) {\n            return pathClone(pth.abs);\n        }\n        if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        if (!pathArray || !pathArray.length) {\n            return [[\"M\", 0, 0]];\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0,\n            pa0;\n        if (pathArray[0][0] == \"M\") {\n            x = +pathArray[0][1];\n            y = +pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res[0] = [\"M\", x, y];\n        }\n        var crz = pathArray.length == 3 &&\n            pathArray[0][0] == \"M\" &&\n            pathArray[1][0].toUpperCase() == \"R\" &&\n            pathArray[2][0].toUpperCase() == \"Z\";\n        for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n            res.push(r = []);\n            pa = pathArray[i];\n            pa0 = pa[0];\n            if (pa0 != pa0.toUpperCase()) {\n                r[0] = pa0.toUpperCase();\n                switch (r[0]) {\n                    case \"A\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] + x);\n                        r[7] = +(pa[7] + y);\n                        break;\n                    case \"V\":\n                        r[1] = +pa[1] + y;\n                        break;\n                    case \"H\":\n                        r[1] = +pa[1] + x;\n                        break;\n                    case \"R\":\n                        var dots = [x, y].concat(pa.slice(1));\n                        for (var j = 2, jj = dots.length; j < jj; j++) {\n                            dots[j] = +dots[j] + x;\n                            dots[++j] = +dots[j] + y;\n                        }\n                        res.pop();\n                        res = res.concat(catmullRom2bezier(dots, crz));\n                        break;\n                    case \"O\":\n                        res.pop();\n                        dots = ellipsePath(x, y, pa[1], pa[2]);\n                        dots.push(dots[0]);\n                        res = res.concat(dots);\n                        break;\n                    case \"U\":\n                        res.pop();\n                        res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                        r = [\"U\"].concat(res[res.length - 1].slice(-2));\n                        break;\n                    case \"M\":\n                        mx = +pa[1] + x;\n                        my = +pa[2] + y;\n                    default:\n                        for (j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +pa[j] + ((j % 2) ? x : y);\n                        }\n                }\n            } else if (pa0 == \"R\") {\n                dots = [x, y].concat(pa.slice(1));\n                res.pop();\n                res = res.concat(catmullRom2bezier(dots, crz));\n                r = [\"R\"].concat(pa.slice(-2));\n            } else if (pa0 == \"O\") {\n                res.pop();\n                dots = ellipsePath(x, y, pa[1], pa[2]);\n                dots.push(dots[0]);\n                res = res.concat(dots);\n            } else if (pa0 == \"U\") {\n                res.pop();\n                res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                r = [\"U\"].concat(res[res.length - 1].slice(-2));\n            } else {\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    r[k] = pa[k];\n                }\n            }\n            pa0 = pa0.toUpperCase();\n            if (pa0 != \"O\") {\n                switch (r[0]) {\n                    case \"Z\":\n                        x = mx;\n                        y = my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n        }\n        res.toString = toString;\n        pth.abs = pathClone(res);\n        return res;\n    }\n    function l2c(x1, y1, x2, y2) {\n        return [x1, y1, x2, y2, x2, y2];\n    }\n    function q2c(x1, y1, ax, ay, x2, y2) {\n        var _13 = 1 / 3,\n            _23 = 2 / 3;\n        return [\n                _13 * x1 + _23 * ax,\n                _13 * y1 + _23 * ay,\n                _13 * x2 + _23 * ax,\n                _13 * y2 + _23 * ay,\n                x2,\n                y2\n            ];\n    }\n    function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n        // for more information of where this math came from visit:\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        var _120 = PI * 120 / 180,\n            rad = PI / 180 * (+angle || 0),\n            res = [],\n            xy,\n            rotate = Snap._.cacher(function (x, y, rad) {\n                var X = x * math.cos(rad) - y * math.sin(rad),\n                    Y = x * math.sin(rad) + y * math.cos(rad);\n                return {x: X, y: Y};\n            });\n        if (!recursive) {\n            xy = rotate(x1, y1, -rad);\n            x1 = xy.x;\n            y1 = xy.y;\n            xy = rotate(x2, y2, -rad);\n            x2 = xy.x;\n            y2 = xy.y;\n            var cos = math.cos(PI / 180 * angle),\n                sin = math.sin(PI / 180 * angle),\n                x = (x1 - x2) / 2,\n                y = (y1 - y2) / 2;\n            var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n            if (h > 1) {\n                h = math.sqrt(h);\n                rx = h * rx;\n                ry = h * ry;\n            }\n            var rx2 = rx * rx,\n                ry2 = ry * ry,\n                k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                    math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                cx = k * rx * y / ry + (x1 + x2) / 2,\n                cy = k * -ry * x / rx + (y1 + y2) / 2,\n                f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n            f1 = x1 < cx ? PI - f1 : f1;\n            f2 = x2 < cx ? PI - f2 : f2;\n            f1 < 0 && (f1 = PI * 2 + f1);\n            f2 < 0 && (f2 = PI * 2 + f2);\n            if (sweep_flag && f1 > f2) {\n                f1 = f1 - PI * 2;\n            }\n            if (!sweep_flag && f2 > f1) {\n                f2 = f2 - PI * 2;\n            }\n        } else {\n            f1 = recursive[0];\n            f2 = recursive[1];\n            cx = recursive[2];\n            cy = recursive[3];\n        }\n        var df = f2 - f1;\n        if (abs(df) > _120) {\n            var f2old = f2,\n                x2old = x2,\n                y2old = y2;\n            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n            x2 = cx + rx * math.cos(f2);\n            y2 = cy + ry * math.sin(f2);\n            res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n        }\n        df = f2 - f1;\n        var c1 = math.cos(f1),\n            s1 = math.sin(f1),\n            c2 = math.cos(f2),\n            s2 = math.sin(f2),\n            t = math.tan(df / 4),\n            hx = 4 / 3 * rx * t,\n            hy = 4 / 3 * ry * t,\n            m1 = [x1, y1],\n            m2 = [x1 + hx * s1, y1 - hy * c1],\n            m3 = [x2 + hx * s2, y2 - hy * c2],\n            m4 = [x2, y2];\n        m2[0] = 2 * m1[0] - m2[0];\n        m2[1] = 2 * m1[1] - m2[1];\n        if (recursive) {\n            return [m2, m3, m4].concat(res);\n        } else {\n            res = [m2, m3, m4].concat(res).join().split(\",\");\n            var newres = [];\n            for (var i = 0, ii = res.length; i < ii; i++) {\n                newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n            }\n            return newres;\n        }\n    }\n    function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t;\n        return {\n            x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n            y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n        };\n    }\n    function curveDim(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\n            b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\n            c = p1x - c1x,\n            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            y = [p1y, p2y],\n            x = [p1x, p2x],\n            dot;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\n        b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\n        c = p1y - c1y;\n        t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        return {\n            min: {x: mmin.apply(0, x), y: mmin.apply(0, y)},\n            max: {x: mmax.apply(0, x), y: mmax.apply(0, y)}\n        };\n    }\n    function path2curve(path, path2) {\n        var pth = !path2 && paths(path);\n        if (!path2 && pth.curve) {\n            return pathClone(pth.curve);\n        }\n        var p = pathToAbsolute(path),\n            p2 = path2 && pathToAbsolute(path2),\n            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            processPath = function (path, d) {\n                var nx, ny;\n                if (!path) {\n                    return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                }\n                !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);\n                switch (path[0]) {\n                    case \"M\":\n                        d.X = path[1];\n                        d.Y = path[2];\n                        break;\n                    case \"A\":\n                        path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n                        break;\n                    case \"S\":\n                        nx = d.x + (d.x - (d.bx || d.x));\n                        ny = d.y + (d.y - (d.by || d.y));\n                        path = [\"C\", nx, ny].concat(path.slice(1));\n                        break;\n                    case \"T\":\n                        d.qx = d.x + (d.x - (d.qx || d.x));\n                        d.qy = d.y + (d.y - (d.qy || d.y));\n                        path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                        break;\n                    case \"Q\":\n                        d.qx = path[1];\n                        d.qy = path[2];\n                        path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                        break;\n                    case \"L\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n                        break;\n                    case \"H\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n                        break;\n                    case \"V\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n                        break;\n                    case \"Z\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n                        break;\n                }\n                return path;\n            },\n            fixArc = function (pp, i) {\n                if (pp[i].length > 7) {\n                    pp[i].shift();\n                    var pi = pp[i];\n                    while (pi.length) {\n                        pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n                    }\n                    pp.splice(i, 1);\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            fixM = function (path1, path2, a1, a2, i) {\n                if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                    path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                    a1.bx = 0;\n                    a1.by = 0;\n                    a1.x = path1[i][1];\n                    a1.y = path1[i][2];\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            };\n        for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n            p[i] = processPath(p[i], attrs);\n            fixArc(p, i);\n            p2 && (p2[i] = processPath(p2[i], attrs2));\n            p2 && fixArc(p2, i);\n            fixM(p, p2, attrs, attrs2, i);\n            fixM(p2, p, attrs2, attrs, i);\n            var seg = p[i],\n                seg2 = p2 && p2[i],\n                seglen = seg.length,\n                seg2len = p2 && seg2.length;\n            attrs.x = seg[seglen - 2];\n            attrs.y = seg[seglen - 1];\n            attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n            attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n            attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n            attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n            attrs2.x = p2 && seg2[seg2len - 2];\n            attrs2.y = p2 && seg2[seg2len - 1];\n        }\n        if (!p2) {\n            pth.curve = pathClone(p);\n        }\n        return p2 ? [p, p2] : p;\n    }\n    function mapPath(path, matrix) {\n        if (!matrix) {\n            return path;\n        }\n        var x, y, i, j, ii, jj, pathi;\n        path = path2curve(path);\n        for (i = 0, ii = path.length; i < ii; i++) {\n            pathi = path[i];\n            for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                x = matrix.x(pathi[j], pathi[j + 1]);\n                y = matrix.y(pathi[j], pathi[j + 1]);\n                pathi[j] = x;\n                pathi[j + 1] = y;\n            }\n        }\n        return path;\n    }\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n\n    // export\n    Snap.path = paths;\n\n    /*\\\n     * Snap.path.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the given path in pixels\n     **\n     - path (string) SVG path string\n     **\n     = (number) length\n    \\*/\n    Snap.path.getTotalLength = getTotalLength;\n    /*\\\n     * Snap.path.getPointAtLength\n     [ method ]\n     **\n     * Returns the coordinates of the point located at the given length along the given path\n     **\n     - path (string) SVG path string\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    Snap.path.getPointAtLength = getPointAtLength;\n    /*\\\n     * Snap.path.getSubpath\n     [ method ]\n     **\n     * Returns the subpath of a given path between given start and end lengths\n     **\n     - path (string) SVG path string\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    Snap.path.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the path in pixels (only works for `path` elements)\n     = (number) length\n    \\*/\n    elproto.getTotalLength = function () {\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n    };\n    // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a <path> is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n     **\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        return getPointAtLength(this.attr(\"d\"), length);\n    };\n    // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n     **\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n    };\n    Snap._.box = box;\n    /*\\\n     * Snap.path.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds dot coordinates on the given cubic beziér curve at the given t\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point,\n     o     y: (number) y coordinate of the point,\n     o     m: {\n     o         x: (number) x coordinate of the left anchor,\n     o         y: (number) y coordinate of the left anchor\n     o     },\n     o     n: {\n     o         x: (number) x coordinate of the right anchor,\n     o         y: (number) y coordinate of the right anchor\n     o     },\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve,\n     o         y: (number) y coordinate of the start of the curve\n     o     },\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve,\n     o         y: (number) y coordinate of the end of the curve\n     o     },\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    Snap.path.findDotsAtSegment = findDotsAtSegment;\n    /*\\\n     * Snap.path.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given cubic beziér curve\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for beziér curve\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.bezierBBox = bezierBBox;\n    /*\\\n     * Snap.path.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding box\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point is inside\n    \\*/\n    Snap.path.isPointInsideBBox = isPointInsideBBox;\n    /*\\\n     * Snap.path.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if bounding boxes intersect\n    \\*/\n    Snap.path.isBBoxIntersect = isBBoxIntersect;\n    /*\\\n     * Snap.path.intersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point,\n     o         y: (number) y coordinate of the point,\n     o         t1: (number) t value for segment of path1,\n     o         t2: (number) t value for segment of path2,\n     o         segment1: (number) order number for segment of path1,\n     o         segment2: (number) order number for segment of path2,\n     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    Snap.path.intersection = pathIntersection;\n    Snap.path.intersectionNumber = pathIntersectionNumber;\n    /*\\\n     * Snap.path.isPointInside\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     *\n     * Note: fill mode doesn’t affect the result of this method.\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) `true` if point is inside the path\n    \\*/\n    Snap.path.isPointInside = isPointInsidePath;\n    /*\\\n     * Snap.path.getBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given path\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.getBBox = pathBBox;\n    Snap.path.get = getPath;\n    /*\\\n     * Snap.path.toRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into relative values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toRelative = pathToRelative;\n    /*\\\n     * Snap.path.toAbsolute\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into absolute values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toAbsolute = pathToAbsolute;\n    /*\\\n     * Snap.path.toCubic\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic beziér curves\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments\n    \\*/\n    Snap.path.toCubic = path2curve;\n    /*\\\n     * Snap.path.map\n     [ method ]\n     **\n     * Transform the path string with the given matrix\n     - path (string) path string\n     - matrix (object) see @Matrix\n     = (string) transformed path string\n    \\*/\n    Snap.path.map = mapPath;\n    Snap.path.toString = toString;\n    Snap.path.clone = pathClone;\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var mmax = Math.max,\n        mmin = Math.min;\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i]) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set\n     *\n     * If the function returns `false`, the loop stops running.\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    setproto.remove = function () {\n        while (this.length) {\n            this.pop().remove();\n        }\n        return this;\n    };\n    setproto.attr = function (value) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            this.items[i].attr(value);\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes range of elements from the set\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion… (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found and removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n        return false;\n    };\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin.apply(0, x);\n        y = mmin.apply(0, y);\n        x2 = mmax.apply(0, x2);\n        y2 = mmax.apply(0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y,\n            cx: x + (x2 - x) / 2,\n            cy: y + (y2 - y) / 2\n        };\n    };\n    setproto.clone = function (s) {\n        s = new Set;\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Snap\\u2018s set\";\n    };\n    setproto.type = \"set\";\n    // export\n    Snap.set = function () {\n        var set = new Set;\n        if (arguments.length) {\n            set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n        }\n        return set;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var names = {},\n        reUnit = /[a-z]+$/i,\n        Str = String;\n    names.stroke = names.fill = \"colour\";\n    function getEmpty(item) {\n        var l = item[0];\n        switch (l.toLowerCase()) {\n            case \"t\": return [l, 0, 0];\n            case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n            case \"r\": if (item.length == 4) {\n                return [l, 0, item[2], item[3]];\n            } else {\n                return [l, 0];\n            }\n            case \"s\": if (item.length == 5) {\n                return [l, 1, 1, item[3], item[4]];\n            } else if (item.length == 3) {\n                return [l, 1, 1];\n            } else {\n                return [l, 1];\n            }\n        }\n    }\n    function equaliseTransform(t1, t2, getBBox) {\n        t2 = Str(t2).replace(/\\.{3}|\\u2026/g, t1);\n        t1 = Snap.parseTransformString(t1) || [];\n        t2 = Snap.parseTransformString(t2) || [];\n        var maxlength = Math.max(t1.length, t2.length),\n            from = [],\n            to = [],\n            i = 0, j, jj,\n            tt1, tt2;\n        for (; i < maxlength; i++) {\n            tt1 = t1[i] || getEmpty(t2[i]);\n            tt2 = t2[i] || getEmpty(tt1);\n            if ((tt1[0] != tt2[0]) ||\n                (tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\n                (tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\n                ) {\n                    t1 = Snap._.transform2matrix(t1, getBBox());\n                    t2 = Snap._.transform2matrix(t2, getBBox());\n                    from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n                    to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n                    break;\n            }\n            from[i] = [];\n            to[i] = [];\n            for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n                j in tt1 && (from[i][j] = tt1[j]);\n                j in tt2 && (to[i][j] = tt2[j]);\n            }\n        }\n        return {\n            from: path2array(from),\n            to: path2array(to),\n            f: getPath(from)\n        };\n    }\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    function getColour(clr) {\n        return Snap.rgb(clr[0], clr[1], clr[2]);\n    }\n    function getPath(path) {\n        var k = 0, i, ii, j, jj, out, a, b = [];\n        for (i = 0, ii = path.length; i < ii; i++) {\n            out = \"[\";\n            a = ['\"' + path[i][0] + '\"'];\n            for (j = 1, jj = path[i].length; j < jj; j++) {\n                a[j] = \"val[\" + (k++) + \"]\";\n            }\n            out += a + \"]\";\n            b[i] = out;\n        }\n        return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n    }\n    function path2array(path) {\n        var out = [];\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            for (var j = 1, jj = path[i].length; j < jj; j++) {\n                out.push(path[i][j]);\n            }\n        }\n        return out;\n    }\n    Element.prototype.equal = function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this;\n        if (a == +a && b == +b) {\n            return {\n                from: +a,\n                to: +b,\n                f: getNumber\n            };\n        }\n        if (names[name] == \"colour\") {\n            A = Snap.color(a);\n            B = Snap.color(b);\n            return {\n                from: [A.r, A.g, A.b, A.opacity],\n                to: [B.r, B.g, B.b, B.opacity],\n                f: getColour\n            };\n        }\n        if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n            if (b instanceof Snap.Matrix) {\n                b = b.toTransformString();\n            }\n            if (!Snap._.rgTransform.test(b)) {\n                b = Snap._.svgTransform2string(b);\n            }\n            return equaliseTransform(a, b, function () {\n                return el.getBBox(1);\n            });\n        }\n        if (name == \"d\" || name == \"path\") {\n            A = Snap.path.toCubic(a, b);\n            return {\n                from: path2array(A[0]),\n                to: path2array(A[1]),\n                f: getPath(A[0])\n            };\n        }\n        if (name == \"points\") {\n            A = Str(a).split(\",\");\n            B = Str(b).split(\",\");\n            return {\n                from: A,\n                to: B,\n                f: function (val) { return val; }\n            };\n        }\n        var aUnit = a.match(reUnit),\n            bUnit = Str(b).match(reUnit);\n        if (aUnit && aUnit == bUnit) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getUnit(aUnit)\n            };\n        } else {\n            return {\n                from: this.asPX(name),\n                to: this.asPX(name, b),\n                f: getNumber\n            };\n        }\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n    has = \"hasOwnProperty\",\n    supportsTouch = \"createTouch\" in glob.doc,\n    events = [\n        \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n        \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n        \"touchcancel\"\n    ],\n    touchMap = {\n        mousedown: \"touchstart\",\n        mousemove: \"touchmove\",\n        mouseup: \"touchend\"\n    },\n    getScroll = function (xy) {\n        var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\";\n        return glob.doc.documentElement[name] || glob.doc.body[name];\n    },\n    preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    addEvent = (function () {\n        if (glob.doc.addEventListener) {\n            return function (obj, type, fn, element) {\n                var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n                    f = function (e) {\r\n                        var scrollY = getScroll(\"y\"),\n                            scrollX = getScroll(\"x\");\n                        if (supportsTouch && touchMap[has](type)) {\r\n                            for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\r\n                                if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\r\n                                    var olde = e;\n                                    e = e.targetTouches[i];\n                                    e.originalEvent = olde;\n                                    e.preventDefault = preventTouch;\n                                    e.stopPropagation = stopTouch;\n                                    break;\r\n                                }\r\n                            }\r\n                        }\n                        var x = e.clientX + scrollX,\n                            y = e.clientY + scrollY;\n                        return fn.call(element, e, x, y);\r\n                    };\n\n                if (type !== realName) {\r\n                    obj.addEventListener(type, f, false);\r\n                }\n\n                obj.addEventListener(realName, f, false);\n\n                return function () {\n                    if (type !== realName) {\r\n                        obj.removeEventListener(type, f, false);\r\n                    }\n\n                    obj.removeEventListener(realName, f, false);\n                    return true;\n                };\n            };\n        } else if (glob.doc.attachEvent) {\n            return function (obj, type, fn, element) {\n                var f = function (e) {\n                    e = e || glob.win.event;\n                    var scrollY = getScroll(\"y\"),\n                        scrollX = getScroll(\"x\"),\n                        x = e.clientX + scrollX,\n                        y = e.clientY + scrollY;\n                    e.preventDefault = e.preventDefault || preventDefault;\n                    e.stopPropagation = e.stopPropagation || stopPropagation;\n                    return fn.call(element, e, x, y);\n                };\n                obj.attachEvent(\"on\" + type, f);\n                var detacher = function () {\n                    obj.detachEvent(\"on\" + type, f);\n                    return true;\n                };\n                return detacher;\n            };\n        }\n    })(),\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = getScroll(\"y\"),\n            scrollX = getScroll(\"x\"),\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch) {\n                var i = e.touches && e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                glob = Snap._.glob,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            // glob.win.opera && parent.removeChild(node);\n            // node.style.display = \"none\";\n            // o = dragi.el.paper.getElementByPoint(x, y);\n            // node.style.display = display;\n            // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        Snap.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n        }\n        drag = [];\n    };\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds a click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes a click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds a double click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes a double click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds a mousedown event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes a mousedown event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds a mousemove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes a mousemove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds a mouseout event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes a mouseout event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds a mouseover event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes a mouseover event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds a mouseup event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes a mouseup event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds a touchstart event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes a touchstart event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds a touchmove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes a touchmove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds a touchend event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes a touchend event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds a touchcancel event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes a touchcancel event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            Snap[eventName] = elproto[eventName] = function (fn, scope) {\n                if (Snap.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({\n                        name: eventName,\n                        f: fn,\n                        unbind: addEvent(this.shape || this.node || glob.doc, eventName, fn, scope || this)\n                    });\n                }\n                return this;\n            };\n            Snap[\"un\" + eventName] =\n            elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--) if (events[l].name == eventName &&\n                               (events[l].f == fn || !fn)) {\n                    events[l].unbind();\n                    events.splice(l, 1);\n                    !events.length && delete this.events;\n                    return this;\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds hover event handlers to the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes hover event handlers from the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n    // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n    // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n    // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start.<id> on start, drag.end.<id> on end and drag.move.<id> on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for an element's drag gesture\n     **\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionaly following `drag` events are triggered: `drag.start.<id>` on start, \n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element is dragged over another element \n     * `drag.over.<id>` fires as well.\n     *\n     * Start event and start handler are called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler are called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler are called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        if (!arguments.length) {\n            var origTransform;\n            return this.drag(function (dx, dy) {\n                this.attr({\n                    transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n                });\n            }, function () {\n                origTransform = this.transform().local;\n            });\n        }\n        function start(e, x, y) {\n            (e.originalEvent || e).preventDefault();\n            this._drag.x = x;\n            this._drag.y = y;\n            this._drag.id = e.identifier;\n            !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"snap.drag.start.\" + this.id, onstart);\n            onmove && eve.on(\"snap.drag.move.\" + this.id, onmove);\n            onend && eve.on(\"snap.drag.end.\" + this.id, onend);\n            eve(\"snap.drag.start.\" + this.id, start_scope || move_scope || this, x, y, e);\n        }\n        this._drag = {};\n        draggable.push({el: this, start: start});\n        this.mousedown(start);\n        return this;\n    };\n    /*\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut to assign event handler for `drag.over.<id>` event, where `id` is the element's `id` (see @Element.id)\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    // elproto.onDragOver = function (f) {\n    //     f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n    // };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from the given element\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].start);\n            draggable.splice(i, 1);\n            eve.unbind(\"snap.drag.*.\" + this.id);\n        }\n        !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n        return this;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        pproto = Paper.prototype,\n        rgurl = /^\\s*url\\((.+)\\)/,\n        Str = String,\n        $ = Snap._.$;\n    Snap.filter = {};\n// SIERRA Paper.filter(): I don't understand the note. Does that mean an HTML should dedicate a separate SVG region for a filter definition? What's the advantage over a DEFS?\n    /*\\\n     * Paper.filter\n     [ method ]\n     **\n     * Creates a `<filter>` element\n     **\n     - filstr (string) SVG fragment of filter provided as a string\n     = (object) @Element\n     * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n     > Usage\n     | var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    pproto.filter = function (filstr) {\n        var paper = this;\n        if (paper.type != \"svg\") {\n            paper = paper.paper;\n        }\n        var f = Snap.parse(Str(filstr)),\n            id = Snap._.id(),\n            width = paper.node.offsetWidth,\n            height = paper.node.offsetHeight,\n            filter = $(\"filter\");\n        $(filter, {\n            id: id,\n            filterUnits: \"userSpaceOnUse\"\n        });\n        filter.appendChild(f.node);\n        paper.defs.appendChild(filter);\n        return new Element(filter);\n    };\n    \n    eve.on(\"snap.util.getattr.filter\", function () {\n        eve.stop();\n        var p = $(this.node, \"filter\");\n        if (p) {\n            var match = Str(p).match(rgurl);\n            return match && Snap.select(match[1]);\n        }\n    });\n    eve.on(\"snap.util.attr.filter\", function (value) {\n        if (value instanceof Element && value.type == \"filter\") {\n            eve.stop();\n            var id = value.node.id;\n            if (!id) {\n                $(value.node, {id: value.id});\n                id = value.id;\n            }\n            $(this.node, {\n                filter: Snap.url(id)\n            });\n        }\n        if (!value || value == \"none\") {\n            eve.stop();\n            this.node.removeAttribute(\"filter\");\n        }\n    });\n    /*\\\n     * Snap.filter.blur\n     [ method ]\n     **\n     * Returns an SVG markup string for the blur filter\n     **\n     - x (number) amount of horizontal blur, in pixels\n     - y (number) #optional amount of vertical blur, in pixels\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.blur(5, 10)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.blur = function (x, y) {\n        if (x == null) {\n            x = 2;\n        }\n        var def = y == null ? x : [x, y];\n        return Snap.format('\\<feGaussianBlur stdDeviation=\"{def}\"/>', {\n            def: def\n        });\n    };\n    Snap.filter.blur.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.shadow\n     [ method ]\n     **\n     * Returns an SVG markup string for the shadow filter\n     **\n     - dx (number) horizontal shift of the shadow, in pixels\n     - dy (number) vertical shift of the shadow, in pixels\n     - blur (number) #optional amount of blur\n     - color (string) #optional color of the shadow\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.shadow(0, 2, 3)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.shadow = function (dx, dy, blur, color) {\n        color = color || \"#000\";\n        if (blur == null) {\n            blur = 4;\n        }\n        if (typeof blur == \"string\") {\n            color = blur;\n            blur = 4;\n        }\n        if (dx == null) {\n            dx = 0;\n            dy = 2;\n        }\n        if (dy == null) {\n            dy = dx;\n        }\n        color = Snap.color(color);\n        return Snap.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>', {\n            color: color,\n            dx: dx,\n            dy: dy,\n            blur: blur\n        });\n    };\n    Snap.filter.shadow.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.grayscale\n     [ method ]\n     **\n     * Returns an SVG markup string for the grayscale filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.grayscale = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>', {\n            a: 0.2126 + 0.7874 * (1 - amount),\n            b: 0.7152 - 0.7152 * (1 - amount),\n            c: 0.0722 - 0.0722 * (1 - amount),\n            d: 0.2126 - 0.2126 * (1 - amount),\n            e: 0.7152 + 0.2848 * (1 - amount),\n            f: 0.0722 - 0.0722 * (1 - amount),\n            g: 0.2126 - 0.2126 * (1 - amount),\n            h: 0.0722 + 0.9278 * (1 - amount)\n        });\n    };\n    Snap.filter.grayscale.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.sepia\n     [ method ]\n     **\n     * Returns an SVG markup string for the sepia filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.sepia = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>', {\n            a: 0.393 + 0.607 * (1 - amount),\n            b: 0.769 - 0.769 * (1 - amount),\n            c: 0.189 - 0.189 * (1 - amount),\n            d: 0.349 - 0.349 * (1 - amount),\n            e: 0.686 + 0.314 * (1 - amount),\n            f: 0.168 - 0.168 * (1 - amount),\n            g: 0.272 - 0.272 * (1 - amount),\n            h: 0.534 - 0.534 * (1 - amount),\n            i: 0.131 + 0.869 * (1 - amount)\n        });\n    };\n    Snap.filter.sepia.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.saturate\n     [ method ]\n     **\n     * Returns an SVG markup string for the saturate filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.saturate = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>', {\n            amount: 1 - amount\n        });\n    };\n    Snap.filter.saturate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.hueRotate\n     [ method ]\n     **\n     * Returns an SVG markup string for the hue-rotate filter\n     **\n     - angle (number) angle of rotation\n     = (string) filter representation\n    \\*/\n    Snap.filter.hueRotate = function (angle) {\n        angle = angle || 0;\n        return Snap.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>', {\n            angle: angle\n        });\n    };\n    Snap.filter.hueRotate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.invert\n     [ method ]\n     **\n     * Returns an SVG markup string for the invert filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.invert = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: 1 - amount\n        });\n    };\n    Snap.filter.invert.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.brightness\n     [ method ]\n     **\n     * Returns an SVG markup string for the brightness filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.brightness = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>', {\n            amount: amount\n        });\n    };\n    Snap.filter.brightness.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.contrast\n     [ method ]\n     **\n     * Returns an SVG markup string for the contrast filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.contrast = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: .5 - amount / 2\n        });\n    };\n    Snap.filter.contrast.toString = function () {\n        return this();\n    };\n});\nreturn Snap;\n}));\ndefine('app/heart',['require'],function (require) {\n\t\n\tvar Heart = function (s, x, y) {\n\t\tvar instance = this,\n\t\t\theart,\n\t\t\theartMatrix,\n\t\t\ttotalMaskVertices = 50;\n\t\t\n\t\tthis.el = s.select(\"#heart\");\n\t\theart = this.el.select('#heart-shape');\n\t\t\n\t\tinstance.maskElement = s.path(getPath(totalMaskVertices));\t\t\n\t\tinstance.el.attr({\n\t\t\tclipPath: instance.maskElement\n\t\t});\n\t\t\n\t\tthis.animFill = function (f, dur) {\n\t\t\theart.animate({\n\t\t\t\tfill: f\n\t\t\t}, 200);\n\t\t}\n\t\t\n\t\tthis.setFill = function (f, dur) {\n\t\t\theart.attr({\n\t\t\t\tfill: f\n\t\t\t}, 200);\n\t\t}\n\t\t\n\t\tthis.animScale = function (scale, dur) {\n\t\t\tdur = dur ? dur : 300;\n\t\t\t\n\t\t\tthis.matrix = new Snap.Matrix();\n\t\t\tthis.matrix.translate(x, y);\n\t\t\tthis.matrix.scale(scale);\n\t\t\tthis.el.animate({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t}, dur, mina.bounce);\n\t\t}\n\t\t\n\t\tthis.setScale = function (scale, dur) {\n\t\t\tdur = dur ? dur : 300;\n\t\t\t\n\t\t\tthis.matrix = new Snap.Matrix();\n\t\t\tthis.matrix.translate(x, y);\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.attr({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t});\n\t\t\t\n\t\t}\n\t\t\n\t\tthis.mask = function () {\n\t\t\tvar n = totalMaskVertices;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\td: getPath(n)\n\t\t\t});\n\t\t\t\n\t\t\tfunction updatePath() {\n\t\t\t\tn -= 1;\n\t\t\t\tinstance.maskElement.attr({\n\t\t\t\t\td: getPath(n)\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif (n > 0) {\n\t\t\t\t\tsetTimeout(updatePath, 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tsetTimeout(updatePath, 10);\n\t\t}\n\t\t\n\t\tthis.unmask = function () {\n\t\t\tinstance.maskElement.attr({\n\t\t\t\td: getPath(totalMaskVertices)\n\t\t\t});\n\t\t}\n\t\t\n\t\tfunction getPath(n) {\n\t\t\tvar pathString,\n\t\t\t\ti,\n\t\t\t\t_x,\n\t\t\t\t_y;\n\t\t\t\n\t\t\tpathString = \"M0 0\";\n\t\t\t\n\t\t\tfor (i = 0; i < n + 1; i += 1) {\n\t\t\t\ta = 2 * Math.PI * i / totalMaskVertices;\n                a += Math.PI;\n\n\t\t\t\t_x = Math.sin(a) * 50;\n\t\t\t\t_y = Math.cos(a) * 50;\n\t\t\t\t\n\t\t\t\tpathString += \"L\" + _x + \" \" + _y;\n\t\t\t}\n\t\t\t\n\t\t\tpathString += \"Z\";\n\t\t\treturn pathString;\n\t\t}\n\t}\n\t\n\treturn Heart;\n});\ndefine('app/device',['require'],function (require) {\n\t\n\tvar Device = function (s, x, y) {\n\t\tvar instance = this;\n\t\t\n\t\tthis.el = s.g();\n\t\tthis.matrix = new Snap.Matrix();\n\t\tthis.matrix.translate(x, y);\n\t\tthis.el.transform(this.matrix.toTransformString());\n\t\t\n\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\tthis.keyboardMatrix.translate(0, 70);\n\t\t\n\t\tinstance.maskElement = s.polygon();\n\t\tinstance.maskElement.toDefs();\n\t\t\n\t\taddBack();\n\t\taddScreen();\n\t\t//addGloss();\n\t\taddKeyboard();\n\t\t\n\t\tfunction addBack() {\n\t\t\tinstance.back = s.rect(0, 0, 0, 0);\n\t\t\tinstance.back.attr({\n\t\t\t\tfill: '#696969'\n\t\t\t});\n\n\t\t\tinstance.el.append(instance.back);\t\n\t\t}\n\t\t\n\t\tfunction addScreen() {\n\t\t\tinstance.scr = s.rect(0, 0, 0, 0);\n\t\t\tinstance.scr.attr({\n\t\t\t\tfill: \"#09ae8a\"\n\t\t\t});\n\n\t\t\tinstance.el.append(instance.scr);\n\t\t}\n\t\t\n\t\tfunction addKeyboard() {\n\t\t\tvar p1,\n\t\t\t\tp2;\n\t\t\t\t\n\t\t\tinstance.keyboard = s.g();\n\t\t\tinstance.keyboard.transform(instance.keyboardMatrix.toTransformString());\n\t\t\t\n\t\t\tp1 = s.polygon('-103.324,0 -135.324,32 136.676,32 104.676,0 ');\n\t\t\tp1.attr({\n\t\t\t\tfill: '#818181'\n\t\t\t});\n\t\t\t\n\t\t\tp2 = s.polygon('127.774,40 -128.226,40 -136.226,32 135.774,32 ');\n\t\t\tp2.attr({\n\t\t\t\tfill: '#676767'\n\t\t\t});\n\t\t\t\n\t\t\tinstance.keyboard.append(p1);\n\t\t\tinstance.keyboard.append(p2);\n\t\t\tinstance.el.append(instance.keyboard);\n\t\t}\n\t\t\n\t\tfunction addGloss() {\n\t\t\tinstance.gl = s.rect(0, 0, 0, 0);\n\t\t\tinstance.gl.attr({\n\t\t\t\topacity: 0.2,\n\t\t\t\tfill: \"white\",\n\t\t\t\tclipPath: instance.maskElement\n\t\t\t});\n\t\t\t\n\t\t\tinstance.el.append(instance.gl);\n\t\t}\n\t\t\n\t\tthis.hideKeyboard = function () {\n\t\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\t\tinstance.keyboardMatrix.translate(0, 50);\n\t\t\tinstance.keyboardMatrix.scale(0.01, 0.01, 0, 0);\n\t\t\tinstance.keyboard.animate({\n\t\t\t\topacity: 0,\n\t\t\t\ttransform: instance.keyboardMatrix.toTransformString()\n\t\t\t}, 100);\n\t\t}\n\t\t\n\t\tthis.showKeyboard = function () {\n\t\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\t\tinstance.keyboardMatrix.translate(0, 70);\n\t\t\tinstance.keyboardMatrix.scale(1, 1, 0, 0);\n\t\t\tinstance.keyboard.attr({\n\t\t\t\topacity: 1,\n\t\t\t\ttransform: instance.keyboardMatrix.toTransformString()\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.setScreen = function(w, h) {\n\t\t\tthis.scr.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.setBack = function (w, h) {\n\t\t\tthis.back.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t\t\n\t\t\t/*\n\t\t\tthis.gl.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t\t\n\t\t\tvar pointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\tpoints: pointString\n\t\t\t});\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.setScale = function (scale) {\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.transform(this.matrix.toTransformString());\n\t\t}\n\t\t\n\t\tthis.animScreen = function(w, h) {\n\t\t\tthis.scr.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t}\n\t\t\n\t\tthis.animBack = function (w, h) {\n\t\t\tthis.back.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t\t\n\t\t\t/*\n\t\t\tthis.gl.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t\t\n\t\t\tvar pointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\tpoints: pointString\n\t\t\t});\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.animRotation = function (r) {\n\t\t\tinstance.matrix.rotate(r, 0, 0);\n\t\t\t\t\t\n\t\t\tinstance.el.animate({\n\t\t\t\ttransform: instance.matrix.toTransformString()\n\t\t\t}, 100, mina.easeIn);\n\t\t\t\n\t\t\t/*\n\t\t\tif (r == 90) {\n\t\t\t\tvar w = 100,\n\t\t\t\t\th = 56,\n\t\t\t\t\tpointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\t\n\t\t\t\tinstance.maskElement.attr({\n\t\t\t\t\tpoints: pointString\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tinstance.maskElement.animate({\n\t\t\t\t\ttransform: 'rotate(-90)'\n\t\t\t\t}, 100, mina.easeIn);\n\t\t\t} else {\n\t\t\t\tinstance.maskElement.animate({\n\t\t\t\t\ttransform: 'rotate(0)'\n\t\t\t\t}, 100, mina.easeIn);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.animScale = function (scale, dur, ease) {\n\t\t\tdur = dur ? dur : 100;\n\t\t\tease = ease ? ease : mina.easeout;\n\t\t\t\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.animate({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t}, dur, ease);\n\t\t}\n\t\t\n\t\tthis.animOpacity = function (opacity, dur) {\n\t\t\tdur = dur ? dur : 200;\n\t\t\t\n\t\t\tthis.el.animate({\n\t\t\t\topacity: opacity\n\t\t\t}, dur);\n\t\t}\n\t\t\n\t\tthis.setOpacity = function (opacity) {\t\t\t\n\t\t\tthis.el.attr({\n\t\t\t\topacity: opacity\n\t\t\t});\n\t\t}\n\t}\n\t\n\treturn Device;\n});\ndefine('app/burst',['require'],function (require) {\n\t\n\tvar Burst = function (s, x, y) {\n\t\tvar instance = this,\n\t\t\tpolygons,\n\t\t\tmask,\n\t\t\tmaskCircle,\n\t\t\tmaskBg;\n\t\t\n\t\tthis.el = s.select(\"#burst\");\n\t\t\n\t\tmask = s.g();\n\t\tmask.toDefs();\n\t\t\n\t\tmaskBg = s.rect(-200, -200, 400, 400);\n\t\tmaskBg.attr({\n\t\t\tfill: 'white'\n\t\t});\n\t\tmask.append(maskBg);\n\t\t\n\t\tmaskCircle = s.circle(0, 0, 30);\n\t\tmask.append(maskCircle);\n\t\t\n\t\tthis.el.attr({\n\t\t\tmask: mask\n\t\t});\n\t\t\n\t\tthis.anim = function () {\n\t\t\tthis.el.animate({\n\t\t\t\topacity: 1\n\t\t\t}, 100);\n\t\t\t\n\t\t\tmaskCircle.animate({\n\t\t\t\ttransform: 'scale(6)'\n\t\t\t}, 300);\n\t\t\t\n\t\t\tsetTimeout(function () {\n\t\t\t\tinstance.el.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 100);\n\t\t\t}, 300)\n\t\t}\n\t\t\n\t\tthis.reset = function () {\n\t\t\tmaskCircle.attr({\n\t\t\t\ttransform: 'scale(1)'\n\t\t\t});\n\t\t}\n\t}\n\t\n\treturn Burst;\n});\n//============================================================\n//\n// Copyright (C) 2013 Matthew Wagerfield\n//\n// Twitter: https://twitter.com/mwagerfield\n//\n// Permission is hereby granted, free of charge, to any\n// person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the\n// Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do\n// so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice\n// shall be included in all copies or substantial portions\n// of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY\n// OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n// EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n// OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//============================================================\n\n/**\n * Defines the Flat Surface Shader namespace for all the awesomeness to exist upon.\n * @author Matthew Wagerfield\n */\nFSS = {\n  FRONT  : 0,\n  BACK   : 1,\n  DOUBLE : 2,\n  SVGNS  : 'http://www.w3.org/2000/svg'\n};\n\n/**\n * @class Array\n * @author Matthew Wagerfield\n */\nFSS.Array = typeof Float32Array === 'function' ? Float32Array : Array;\n\n/**\n * @class Utils\n * @author Matthew Wagerfield\n */\nFSS.Utils = {\n  isNumber: function(value) {\n    return !isNaN(parseFloat(value)) && isFinite(value);\n  }\n};\n\n/**\n * Request Animation Frame Polyfill.\n * @author Paul Irish\n * @see https://gist.github.com/paulirish/1579671\n */\n(function() {\n\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n    window.cancelAnimationFrame  = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = function(callback, element) {\n      var currentTime = new Date().getTime();\n      var timeToCall = Math.max(0, 16 - (currentTime - lastTime));\n      var id = window.setTimeout(function() {\n        callback(currentTime + timeToCall);\n      }, timeToCall);\n      lastTime = currentTime + timeToCall;\n      return id;\n    };\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = function(id) {\n      clearTimeout(id);\n    };\n  }\n\n}());\n\n/**\n * @object Math Augmentation\n * @author Matthew Wagerfield\n */\nMath.PIM2 = Math.PI*2;\nMath.PID2 = Math.PI/2;\nMath.randomInRange = function(min, max) {\n  return min + (max - min) * Math.random();\n};\nMath.clamp = function(value, min, max) {\n  value = Math.max(value, min);\n  value = Math.min(value, max);\n  return value;\n};\n\n/**\n * @object Vector3\n * @author Matthew Wagerfield\n */\nFSS.Vector3 = {\n  create: function(x, y, z) {\n    var vector = new FSS.Array(3);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  clone: function(a) {\n    var vector = this.create();\n    this.copy(vector, a);\n    return vector;\n  },\n  set: function(target, x, y, z) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  copy: function(target, a) {\n    target[0] = a[0];\n    target[1] = a[1];\n    target[2] = a[2];\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    return this;\n  },\n  addVectors: function(target, a, b) {\n    target[0] = a[0] + b[0];\n    target[1] = a[1] + b[1];\n    target[2] = a[2] + b[2];\n    return this;\n  },\n  addScalar: function(target, s) {\n    target[0] += s;\n    target[1] += s;\n    target[2] += s;\n    return this;\n  },\n  subtract: function(target, a) {\n    target[0] -= a[0];\n    target[1] -= a[1];\n    target[2] -= a[2];\n    return this;\n  },\n  subtractVectors: function(target, a, b) {\n    target[0] = a[0] - b[0];\n    target[1] = a[1] - b[1];\n    target[2] = a[2] - b[2];\n    return this;\n  },\n  subtractScalar: function(target, s) {\n    target[0] -= s;\n    target[1] -= s;\n    target[2] -= s;\n    return this;\n  },\n  multiply: function(target, a) {\n    target[0] *= a[0];\n    target[1] *= a[1];\n    target[2] *= a[2];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    return this;\n  },\n  divide: function(target, a) {\n    target[0] /= a[0];\n    target[1] /= a[1];\n    target[2] /= a[2];\n    return this;\n  },\n  divideVectors: function(target, a, b) {\n    target[0] = a[0] / b[0];\n    target[1] = a[1] / b[1];\n    target[2] = a[2] / b[2];\n    return this;\n  },\n  divideScalar: function(target, s) {\n    if (s !== 0) {\n      target[0] /= s;\n      target[1] /= s;\n      target[2] /= s;\n    } else {\n      target[0] = 0;\n      target[1] = 0;\n      target[2] = 0;\n    }\n    return this;\n  },\n  cross: function(target, a) {\n    var x = target[0];\n    var y = target[1];\n    var z = target[2];\n    target[0] = y*a[2] - z*a[1];\n    target[1] = z*a[0] - x*a[2];\n    target[2] = x*a[1] - y*a[0];\n    return this;\n  },\n  crossVectors: function(target, a, b) {\n    target[0] = a[1]*b[2] - a[2]*b[1];\n    target[1] = a[2]*b[0] - a[0]*b[2];\n    target[2] = a[0]*b[1] - a[1]*b[0];\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  },\n  limit: function(target, min, max) {\n    var length = this.length(target);\n    if (min !== null && length < min) {\n      this.setLength(target, min);\n    } else if (max !== null && length > max) {\n      this.setLength(target, max);\n    }\n    return this;\n  },\n  dot: function(a, b) {\n    return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n  },\n  normalise: function(target) {\n    return this.divideScalar(target, this.length(target));\n  },\n  negate: function(target) {\n    return this.multiplyScalar(target, -1);\n  },\n  distanceSquared: function(a, b) {\n    var dx = a[0] - b[0];\n    var dy = a[1] - b[1];\n    var dz = a[2] - b[2];\n    return dx*dx + dy*dy + dz*dz;\n  },\n  distance: function(a, b) {\n    return Math.sqrt(this.distanceSquared(a, b));\n  },\n  lengthSquared: function(a) {\n    return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];\n  },\n  length: function(a) {\n    return Math.sqrt(this.lengthSquared(a));\n  },\n  setLength: function(target, l) {\n    var length = this.length(target);\n    if (length !== 0 && l !== length) {\n      this.multiplyScalar(target, l / length);\n    }\n    return this;\n  }\n};\n\n/**\n * @object Vector4\n * @author Matthew Wagerfield\n */\nFSS.Vector4 = {\n  create: function(x, y, z, w) {\n    var vector = new FSS.Array(4);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  set: function(target, x, y, z, w) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    target[3] = w || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  setW: function(target, w) {\n    target[3] = w || 0;\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    target[3] += a[3];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    target[3] = a[3] * b[3];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    target[3] *= s;\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    if (target[3] < value) { target[3] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    if (target[3] > value) { target[3] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  }\n};\n\n/**\n * @class Color\n * @author Matthew Wagerfield\n */\nFSS.Color = function(hex, opacity) {\n  this.rgba = FSS.Vector4.create();\n  this.hex = hex || '#000000';\n  this.opacity = FSS.Utils.isNumber(opacity) ? opacity : 1;\n  this.set(this.hex, this.opacity);\n};\n\nFSS.Color.prototype = {\n  set: function(hex, opacity) {\n    hex = hex.replace('#', '');\n    var size = hex.length / 3;\n    this.rgba[0] = parseInt(hex.substring(size*0, size*1), 16) / 255;\n    this.rgba[1] = parseInt(hex.substring(size*1, size*2), 16) / 255;\n    this.rgba[2] = parseInt(hex.substring(size*2, size*3), 16) / 255;\n    this.rgba[3] = FSS.Utils.isNumber(opacity) ? opacity : this.rgba[3];\n    return this;\n  },\n  hexify: function(channel) {\n    var hex = Math.ceil(channel*255).toString(16);\n    if (hex.length === 1) { hex = '0' + hex; }\n    return hex;\n  },\n  format: function() {\n    var r = this.hexify(this.rgba[0]);\n    var g = this.hexify(this.rgba[1]);\n    var b = this.hexify(this.rgba[2]);\n    this.hex = '#' + r + g + b;\n    return this.hex;\n  }\n};\n\n/**\n * @class Object\n * @author Matthew Wagerfield\n */\nFSS.Object = function() {\n  this.position = FSS.Vector3.create();\n};\n\nFSS.Object.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n\n/**\n * @class Light\n * @author Matthew Wagerfield\n */\nFSS.Light = function(ambient, diffuse) {\n  FSS.Object.call(this);\n  this.ambient = new FSS.Color(ambient || '#FFFFFF');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.ray = FSS.Vector3.create();\n};\n\nFSS.Light.prototype = Object.create(FSS.Object.prototype);\n\n/**\n * @class Vertex\n * @author Matthew Wagerfield\n */\nFSS.Vertex = function(x, y, z) {\n  this.position = FSS.Vector3.create(x, y, z);\n};\n\nFSS.Vertex.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n\n/**\n * @class Triangle\n * @author Matthew Wagerfield\n */\nFSS.Triangle = function(a, b, c, s, material) {\n  this.a = a || new FSS.Vertex();\n  this.b = b || new FSS.Vertex();\n  this.c = c || new FSS.Vertex();\n  this.vertices = [this.a, this.b, this.c];\n  this.u = FSS.Vector3.create();\n  this.v = FSS.Vector3.create();\n  this.centroid = FSS.Vector3.create();\n  this.normal = FSS.Vector3.create();\n  this.material = material || new FSS.Material();\n  this.color = new FSS.Color();\n  this.polygon = s.polygon();\n  this.polygon.attr({\n    'stroke-linejoin': 'round',\n\t'stroke-miterlimit': 1,\n\t'stroke-width': 1\n  });\n\n  this.computeCentroid();\n  this.computeNormal();\n};\n\nFSS.Triangle.prototype = {\n  computeCentroid: function() {\n    this.centroid[0] = this.a.position[0] + this.b.position[0] + this.c.position[0];\n    this.centroid[1] = this.a.position[1] + this.b.position[1] + this.c.position[1];\n    this.centroid[2] = this.a.position[2] + this.b.position[2] + this.c.position[2];\n    FSS.Vector3.divideScalar(this.centroid, 3);\n    return this;\n  },\n  computeNormal: function() {\n    FSS.Vector3.subtractVectors(this.u, this.b.position, this.a.position);\n    FSS.Vector3.subtractVectors(this.v, this.c.position, this.a.position);\n    FSS.Vector3.crossVectors(this.normal, this.u, this.v);\n    FSS.Vector3.normalise(this.normal);\n    return this;\n  }\n};\n\n/**\n * @class Geometry\n * @author Matthew Wagerfield\n */\nFSS.Geometry = function() {\n  this.vertices = [];\n  this.triangles = [];\n  this.dirty = false;\n};\n\nFSS.Geometry.prototype = {\n  update: function() {\n    if (this.dirty) {\n      var t,triangle;\n      for (t = this.triangles.length - 1; t >= 0; t--) {\n        triangle = this.triangles[t];\n        triangle.computeCentroid();\n        triangle.computeNormal();\n      }\n      this.dirty = false;\n    }\n    return this;\n  }\n};\n\n/**\n * @class Plane\n * @author Matthew Wagerfield\n */\nFSS.Plane = function(width, height, segments, slices, s, material) {\n  FSS.Geometry.call(this);\n  this.width = width || 100;\n  this.height = height || 100;\n  this.segments = segments || 4;\n  this.slices = slices || 4;\n  this.segmentWidth = this.width / this.segments;\n  this.sliceHeight = this.height / this.slices;\n\n  // Cache Variables\n  var x, y, v0, v1, v2, v3,\n      vertex, triangle, vertices = [],\n      offsetX = this.width * -0.5,\n      offsetY = this.height * 0.5;\n\n  // Add Vertices\n  for (x = 0; x <= this.segments; x++) {\n    vertices.push([]);\n    for (y = 0; y <= this.slices; y++) {\n      vertex = new FSS.Vertex(offsetX + x*this.segmentWidth, offsetY - y*this.sliceHeight);\n      vertices[x].push(vertex);\n      this.vertices.push(vertex);\n    }\n  }\n\n  // Add Triangles\n  for (x = 0; x < this.segments; x++) {\n    for (y = 0; y < this.slices; y++) {\n      v0 = vertices[x+0][y+0];\n      v1 = vertices[x+0][y+1];\n      v2 = vertices[x+1][y+0];\n      v3 = vertices[x+1][y+1];\n      t0 = new FSS.Triangle(v0, v1, v2, s, material);\n      t1 = new FSS.Triangle(v2, v1, v3, s, material);\n      this.triangles.push(t0, t1);\n    }\n  }\n};\n\nFSS.Plane.prototype = Object.create(FSS.Geometry.prototype);\n\n/**\n * @class Material\n * @author Matthew Wagerfield\n */\nFSS.Material = function(ambient, diffuse) {\n  this.ambient = new FSS.Color(ambient || '#444444');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.slave = new FSS.Color();\n};\n\n/**\n * @class Mesh\n * @author Matthew Wagerfield\n */\nFSS.Mesh = function(geometry, material) {\n  FSS.Object.call(this);\n  this.geometry = geometry || new FSS.Geometry();\n  this.material = material || new FSS.Material();\n  this.side = FSS.FRONT;\n  this.visible = true;\n};\n\nFSS.Mesh.prototype = Object.create(FSS.Object.prototype);\n\nFSS.Mesh.prototype.update = function(lights, calculate) {\n  var t,triangle, l,light, illuminance;\n\n  // Update Geometry\n  this.geometry.update();\n\n  // Calculate the triangle colors\n  if (calculate) {\n\n    // Iterate through Triangles\n    for (t = this.geometry.triangles.length - 1; t >= 0; t--) {\n      triangle = this.geometry.triangles[t];\n\n      // Reset Triangle Color\n      FSS.Vector4.set(triangle.color.rgba);\n\n      // Iterate through Lights\n      for (l = lights.length - 1; l >= 0; l--) {\n        light = lights[l];\n\n        // Calculate Illuminance\n        FSS.Vector3.subtractVectors(light.ray, light.position, triangle.centroid);\n        FSS.Vector3.normalise(light.ray);\n        illuminance = FSS.Vector3.dot(triangle.normal, light.ray);\n        if (this.side === FSS.FRONT) {\n          illuminance = Math.max(illuminance, 0);\n        } else if (this.side === FSS.BACK) {\n          illuminance = Math.abs(Math.min(illuminance, 0));\n        } else if (this.side === FSS.DOUBLE) {\n          illuminance = Math.max(Math.abs(illuminance), 0);\n        }\n\n        // Calculate Ambient Light\n        FSS.Vector4.multiplyVectors(triangle.material.slave.rgba, triangle.material.ambient.rgba, light.ambient.rgba);\n        FSS.Vector4.add(triangle.color.rgba, triangle.material.slave.rgba);\n\n        // Calculate Diffuse Light\n        FSS.Vector4.multiplyVectors(triangle.material.slave.rgba, triangle.material.diffuse.rgba, light.diffuse.rgba);\n        FSS.Vector4.multiplyScalar(triangle.material.slave.rgba, illuminance);\n        FSS.Vector4.add(triangle.color.rgba, triangle.material.slave.rgba);\n      }\n\n      // Clamp & Format Color\n      FSS.Vector4.clamp(triangle.color.rgba, 0, 1);\n    }\n  }\n  return this;\n};\n\n/**\n * @class Scene\n * @author Matthew Wagerfield\n */\nFSS.Scene = function() {\n  this.meshes = [];\n  this.lights = [];\n};\n\nFSS.Scene.prototype = {\n  add: function(object) {\n    if (object instanceof FSS.Mesh && !~this.meshes.indexOf(object)) {\n      this.meshes.push(object);\n    } else if (object instanceof FSS.Light && !~this.lights.indexOf(object)) {\n      this.lights.push(object);\n    }\n    return this;\n  },\n  remove: function(object) {\n    if (object instanceof FSS.Mesh && ~this.meshes.indexOf(object)) {\n      this.meshes.splice(this.meshes.indexOf(object), 1);\n    } else if (object instanceof FSS.Light && ~this.lights.indexOf(object)) {\n      this.lights.splice(this.lights.indexOf(object), 1);\n    }\n    return this;\n  }\n};\n\n/**\n * @class Renderer\n * @author Matthew Wagerfield\n */\nFSS.Renderer = function() {\n  this.width = 0;\n  this.height = 0;\n  this.halfWidth = 0;\n  this.halfHeight = 0;\n};\n\nFSS.Renderer.prototype = {\n  setSize: function(width, height) {\n    if (this.width === width && this.height === height) return;\n    this.width = width;\n    this.height = height;\n    this.halfWidth = this.width * 0.5;\n    this.halfHeight = this.height * 0.5;\n    return this;\n  },\n  clear: function() {\n    return this;\n  },\n  render: function(scene) {\n    return this;\n  }\n};\n\n/**\n * @class SVG Renderer\n * @author Matthew Wagerfield\n */\nFSS.SVGRenderer = function(s) {\n  FSS.Renderer.call(this);\n  this.element = s.g();\n};\n\nFSS.SVGRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.SVGRenderer.prototype.setSize = function(width, height) {\n  FSS.Renderer.prototype.setSize.call(this, width, height);\n  return this;\n};\n\nFSS.SVGRenderer.prototype.clear = function() {\n  FSS.Renderer.prototype.clear.call(this);\n  for (var i = this.element.childNodes.length - 1; i >= 0; i--) {\n    this.element.removeChild(this.element.childNodes[i]);\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.render = function(scene) {\n  FSS.Renderer.prototype.render.call(this, scene);\n  var m,mesh, t,triangle, points, style;\n\n  // Update Meshes\n  for (m = scene.meshes.length - 1; m >= 0; m--) {\n    mesh = scene.meshes[m];\n    if (mesh.visible) {\n      mesh.update(scene.lights, true);\n\n      // Render Triangles\n      for (t = mesh.geometry.triangles.length - 1; t >= 0; t--) {\n        triangle = mesh.geometry.triangles[t];\n\n\t\tif (triangle.polygon.parent() !== this.element) {\n\t\t\tthis.element.append(triangle.polygon);\n\t\t}\n\t\t\n        points  = this.formatPoint(triangle.a)+' ';\n        points += this.formatPoint(triangle.b)+' ';\n        points += this.formatPoint(triangle.c);\n        style = this.formatStyle(triangle.color.format());\n\t\t\n\t\ttriangle.polygon.attr({\n\t\t\tpoints: points,\n\t\t\tstyle: style\n\t\t});\n      }\n    }\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.formatPoint = function(vertex) {\n  return (this.halfWidth+vertex.position[0])+','+(this.halfHeight-vertex.position[1]);\n};\n\nFSS.SVGRenderer.prototype.formatStyle = function(color) {\n  var style = 'fill:'+color+';';\n  style += 'stroke:'+color+';';\n  return style;\n};\n\ndefine(\"vendor/fss\", function(){});\n\ndefine('app/mesh',['require','vendor/fss'],function (require) {\n\t\n\trequire('vendor/fss');\n\t\n\tvar Mesh = function (s, container, colorA, colorB) {\n\t\tvar instance = this,\n\t\t\t_width = 440,\n\t\t\t_height = 440,\n\t\t\tnow,\n\t\t\tstart = Date.now(),\n\t\t\trenderer,\n\t\t\tscene,\n\t\t\tgeometry,\n\t\t\tmaterial,\n\t\t\tmesh,\n\t\t\tlight;\n\t\t\n\t\tinstance.animating = false;\n\t\t\n\t\tinstance.init = function () {\n\t\t\trenderer = new FSS.SVGRenderer(s);\n\t\t\trenderer.setSize(_width, _height);\n\t\t\trenderer.element.transform('translate(-20, -20)'); //keep edges from showing\n\t\t\t\n\t\t\tinstance.el = renderer.element;\n\t\t\t\n\t\t\tcontainer.append(renderer.element);\n\n\t\t\tscene = new FSS.Scene();\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\t\t    geometry = new FSS.Plane(_width, _height, 10, 10, s, material);\n\t\t\tmesh = new FSS.Mesh(geometry, material);\n\t\t\tscene.add(mesh);\n\n\t\t\tlight = new FSS.Light('#eeeeee', '#eeeeee');\n\t\t\tlight.setPosition(300*Math.sin(0.001), 200*Math.cos(0.0005), 100);\n\t\t\tscene.add(light);\n\n\t\t\tnow = Date.now() - start;\n\n\t\t\ttweakMesh();\n\t\t\tdistortMesh();\t\t\t\n\t\t\trenderer.render(scene);\n\t\t}\n\t\t\n\t\tinstance.start = function () {\n\t\t\tinstance.animating = true;\n\t\t\tanimate();\n\t\t}\n\t\t\n\t\tinstance.stop = function () {\n\t\t\tinstance.animating = false;\n\t\t}\n\t\t\n\t\tinstance.setColor = function (colorA, colorB) {\n\t\t\tvar i;\n\t\t\t\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\t\t\t\n\t\t\tfor (i = geometry.triangles.length - 1; i > -1; i -= 1) {\t\n\t\t\t\tgeometry.triangles[i].material = material;\n\t\t\t}\n\t\t\t\n\t\t\tanimate();\n\t\t}\n\t\t\n\t\tinstance.rippleColor = function (colorA, colorB) {\n\t\t\tvar i;\n\t\t\t\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\n\t\t\tfunction colorTriangle(j) {\n\t\t\t\tgeometry.triangles[j].material = material;\n\n\t\t\t\tif (j == 0) {\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\tanimate();\n\t\t\t\t\t}, 10); //force clear\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = geometry.triangles.length - 1; i > -1; i -= 1) {\t\t\t\t\t\t\t\t\n\t\t\t\tvar speed = 200 + Math.sin(0.1 + Math.abs(geometry.triangles[i].centroid[0] / geometry.triangles[i].centroid[1])) * 100;\n\t\t\t\tsetTimeout(colorTriangle, speed * 2, i);\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\tfunction tweakMesh() {\n\t\t\tvar v, vertex;\n\t\t\t\n\t\t\tfor (v = geometry.vertices.length - 1; v >= 0; v--) {\n\t\t\t      vertex = geometry.vertices[v];\n\t\t\t      vertex.anchor = FSS.Vector3.clone(vertex.position);\n\t\t\t      vertex.step = FSS.Vector3.create(\n\t\t\t        Math.randomInRange(0.2, 1.0),\n\t\t\t        Math.randomInRange(0.2, 1.0),\n\t\t\t        Math.randomInRange(0.2, 1.0)\n\t\t\t      );\n\t\t\t\tvertex.time = Math.randomInRange(0, Math.PIM2);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction distortMesh() {\n\t\t\tvar v,\n\t\t\t\tvertex,\n\t\t\t\tox, oy, oz,\n\t\t\t\toffset = 10 / 2;\n\t\t\t\n\t\t\tfor (v = geometry.vertices.length - 1; v >= 0; v--) {\n\t\t      vertex = geometry.vertices[v];\n\t\t      ox = Math.sin(vertex.time + vertex.step[0] * now * 0.002);\n\t\t      oy = Math.cos(vertex.time + vertex.step[1] * now * 0.002);\n\t\t      oz = Math.sin(vertex.time + vertex.step[2] * now * 0.002);\n\t\t      FSS.Vector3.set(vertex.position,\n\t\t        0.2 * geometry.segmentWidth * ox,\n\t\t        0.1 * geometry.sliceHeight * oy,\n\t\t        0.7 * offset * oz - offset);\n\t\t      FSS.Vector3.add(vertex.position, vertex.anchor);\n\t\t    }\n\n\t\t    geometry.dirty = true;\n\t\t}\n\t\n\t\tfunction animate() {\n\t\t\tnow = Date.now() - start;\n\t\t\t\n\t\t\tif (mobilecheck() !== true) {\n\t\t\t\tdistortMesh();\n\t\t\t}\n\t\t\t\n\t\t\trenderer.render(scene);\n\t\t\t\n\t\t\tif (instance.animating !== false) {\n\t\t\t\trequestAnimationFrame(animate);\n\t\t\t}\n\t\t}\n\t\t\n\t\tinstance.init();\n\t}\n\t\n\treturn Mesh;\n});\ndefine('app/logo',['require'],function (require) {\n\t\t\n\tvar Logo = function (s) {\n\t\tvar instance = this,\n\t\t\tlogo,\n\t\t\tparts = [\n\t\t\t\t['top', 0, 20], \n\t\t\t\t['left', 20, 0], \n\t\t\t\t['bottom', 0, -20],\n\t\t\t\t['right', -20, 0]\n\t\t\t],\n\t\t\tcomponents = [],\n\t\t\ti = 0,\n\t\t\tk = 0,\n\t\t\tisLogoAnimated = false,\n\t\t\tisCrocAnimated = false,\n\t\t\tisCroc2Animated = false;\n\t\t\n\t\tlogo = s.select(\"#snap-logo\");\n\n\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\tvar el = parts[i]\n\t\t\telid = el[0];\n\t\t\telement = logo.select(\"#snap-logo-\" + elid);\n\t\t\telement.attr({opacity:0, transform: \"t\" + (el[1]) + \",\" + (el[2])});\n\t\t    components.push(element);\n\t\t}\n\n\t\tfunction animateEach() {\n\t\t\tif (!components[k]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t    components[k].animate({ \n\t\t        transform: \"t\" + (0) + \",\" + (0),\n\t\t        opacity: 1\n\t\t    }, 250, mina.easeout);\n\t\t\tsetTimeout(animateEach, 150);\n\t\t\tk++;\n\t\t};\n\t\t\n\t\tthis.animate = function () {\n\t\t\tsetTimeout(animateEach, 150);\n\t\t}\n\t\t\n\t\tthis.show = function () {\n\t\t\tvar i;\n\t\t\t\n\t\t\tfor (i = 0; i < components.length; i += 1) {\n\t\t\t\tcomponents[i].attr({ \n\t\t\t    \ttransform: \"t\" + (0) + \",\" + (0),\n\t\t\t    \topacity: 1\n\t\t\t    });\n\t\t\t}\n\t\t    \n\t\t}\n\t}\n\t\n\treturn Logo;\n});\ndefine('app/app',['require','snap','app/heart','app/device','app/burst','app/mesh','app/logo'],function (require) {\n\n\trequire('snap');\n\t\n\tvar App,\n\t\tHeart = require('app/heart'),\n\t\tDevice = require('app/device'),\n\t\tBurst = require('app/burst');\n\t\tMesh = require('app/mesh');\n\t\tLogo = require('app/logo');\n\n\tApp = function () {\n\t\tvar instance = this;\n\t\t\n\t\tthis.started = false;\n\t\t\t\t\n\t\tthis.init = function () {\n\t\t\tvar timeline,\n\t\t\t\tad,\n\t\t\t\ts,\n\t\t\t\tcover,\n\t\t\t\tdevice,\n\t\t\t\theart,\n\t\t\t\tburst,\n\t\t\t\tscreen1,\n\t\t\t\ttext1,\n\t\t\t\ttext2,\n\t\t\t\ttext3,\n\t\t\t\ttext4,\n\t\t\t\tresolveScreen,\n\t\t\t\tlogo,\n\t\t\t\tmeshA,\n\t\t\t\tmeshAContainer,\n\t\t\t\treplaycount = 0,\n\t\t\t\tWIDTH = 400,\n\t\t\t\tHEIGHT = 400,\n\t\t\t\tWHITE = \"#ffffff\",\n\t\t\t\tGREEN = \"#09ae8a\";\n\t\t\t\n\t\t\tthis.started = true;\n\t\t\t\n\t\t\tad = document.getElementById('ad');\n\t\t\ts = new Snap(\"#ad\");\n\t\t\tcover = s.select('#cover');\n\t\t\tmeshAContainer = s.select('#meshAContainer');\n\t\t\tscreen1 = s.select('#screen1');\n\t\t\ttext1 = s.select('#text1');\n\t\t\ttext2 = s.select('#text2');\n\t\t\ttext3 = s.select('#text3');\n\t\t\ttext4 = s.select('#text4');\n\t\t\treplayBtn = s.select('#replay-btn');\n\t\t\tresolveScreen = s.select('#resolve');\n\t\t\tlogo = new Logo(s);\n\t\t\t\n\t\t\thandle_RESIZE();\n\t\t\twindow.addEventListener('resize', handle_RESIZE);\n\t\t\tad.addEventListener('click', handle_CLICK);\t\t\t\n\t\t\treplayBtn.click(replay_CLICK);\n\t\t\t\n\t\t\taddMeshA();\t\n\t\t\tcover.remove();\n\t\t\taddHeart();\n\t\t\taddComputer();\n\t\t\taddBurst();\n\t\t\t\n\t\t\tfunction addHeart() {\n\t\t\t\theart = new Heart(s, WIDTH / 2, HEIGHT / 2);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addComputer() {\n\t\t\t\tdevice = new Device(s, WIDTH / 2, HEIGHT / 2);\n\t\t\t\tdevice.setScreen(192, 112);\n\t\t\t\tdevice.setBack(208, 148);\n\t\t\t\tdevice.setScale(0.1);\n\t\t\t\ttext2.after(device.el);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addBurst() {\n\t\t\t\tburst = new Burst(s);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addMeshA() {\n\t\t\t\tmeshA = new Mesh(s, meshAContainer, '#afafaf', '#afafaf');\n\t\t\t}\n\t\t\t\n\t\t\tfunction addMeshB() {\n\t\t\t\tmeshA.el.remove();\n\t\t\t\tmeshB = new Mesh(s, meshBContainer, '#09ae8a', '#777777');\n\t\t\t}\n\t\t\t\n\t\t\tfunction showMeshB() {\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshB.start();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfunction showComputer() {\n\t\t\t\ttext1.animate({y: 80}, 100);\n\t\t\t\ttext2.animate({y: 350}, 100);\n\t\t\t\tdevice.animScale(10, 300, mina.bounce);\n\t\t\t\theart.animFill(WHITE);\n\t\t\t}\n\t\t\t\n\t\t\tfunction toTablet() {\n\t\t\t\tdevice.animRotation(-90);\t\n\t\t\t\tdevice.animScreen(76, 100);\n\t\t\t\tdevice.animBack(92, 132);\n\t\t\t\theart.animScale(0.5, 200);\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction toPhone() {\n\t\t\t\tdevice.hideKeyboard();\n\t\t\t\tdevice.animScreen(48, 76);\n\t\t\t\tdevice.animBack(56, 100);\n\t\t\t\theart.animScale(0.3);\n\t\t\t}\n\t\t\t\n\t\t\tfunction rotate() {\n\t\t\t\tdevice.animRotation(90);\n\t\t\t\theart.animScale(0.4);\n\t\t\t}\n\t\t\t\n\t\t\tfunction zoom() {\n\t\t\t\tmeshA.stop();\n\t\t\t\tdevice.animScale(10, 600);\n\t\t\t\theart.animScale(4, 600);\n\t\t\t\tburst.anim();\n\t\t\t}\n\t\t\t\n\t\t\tfunction greenMesh() {\n\t\t\t\t\n\t\t\t\tmeshA.setColor('#09ae8a', '#777777');\n\t\t\t\t\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.start();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdevice.animOpacity(0, 200);\n\t\t\t\tscreen1.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t\t\n\t\t\tfunction maskReveal() {\n\t\t\t\theart.mask();\n\t\t\t}\n\t\t\t\n\t\t\tfunction showText3() {\n\t\t\t\tdevice.setScale(0.01);\n\t\t\t\ttext3.animate({\n\t\t\t\t\topacity: 1\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t\t\n\t\t\tfunction hideText3() {\n\t\t\t\ttext3.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 200);\n\t\t\t\t\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.rippleColor('#afafaf', '#afafaf');\n\t\t\t\t} else {\n\t\t\t\t\tmeshA.setColor('#afafaf', '#afafaf');\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfunction resolve() {\n\t\t\t\tresolveScreen.animate({\n\t\t\t\t\topacity: 1\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t\t\n\t\t\tfunction stop() {\n\t\t\t\tlogo.animate();\n\t\t\t\tmeshA.stop();\n\t\t\t}\n\t\t\t\n\t\t\tfunction reset() {\n\t\t\t\tresolveScreen.attr({\n\t\t\t\t\topacity: 0\n\t\t\t\t});\t\t\n\t\t\t\t\n\t\t\t\tscreen1.attr({\n\t\t\t\t\topacity: 1\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttext1.attr({y: 130});\n\t\t\t\ttext2.attr({y: 300});\n\t\t\t\t\n\t\t\t\theart.setScale(1);\n\t\t\t\theart.setFill('#0DAE8A');\n\t\t\t\theart.unmask();\n\t\t\t\tdevice.setOpacity(1);\n\t\t\t\tdevice.setScreen(192, 112);\n\t\t\t\tdevice.setBack(208, 148);\n\t\t\t\tdevice.showKeyboard();\n\t\t\t\tmeshA.start();\n\t\t\t\tburst.reset();\n\t\t\t}\n\t\t\t\n\t\t\tfunction replay_CLICK(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t\n\t\t\t\treplaycount += 1;\n\t\t\t\tga('send', 'event', 'button', 'click', 'replay', replaycount);\n\t\t\t\treset();\n\t\t\t\trun();\n\t\t\t}\n\t\t\t\n\t\t\tfunction handle_CLICK(e) {\n\t\t\t\tga('send', 'event', 'button', 'click', 'ad');\n\t\t\t\ttop.window.location.href = 'http://snapsvg.io/';\n\t\t\t}\n\t\t\t\n\t\t\tfunction handle_RESIZE() {\n\t\t\t\tvar _w = window.innerWidth,\n\t\t\t\t\tscale = _w / 400;\n\t\t\t\t\n\t\t\t\tad.style.webkitTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.MozTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.msTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.oTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.transform = 'scale(' + scale + ')';\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction run() {\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.start();\n\t\t\t\t}\n\t\t\t\tsetTimeout(showComputer, 2000);\n\t\t\t\tsetTimeout(toPhone, 3000);\n\t\t\t\tsetTimeout(rotate, 4000);\n\t\t\t\tsetTimeout(toTablet, 5000);\n\t\t\t\tsetTimeout(zoom, 6000);\n\t\t\t\tsetTimeout(greenMesh, 6300);\n\t\t\t\tsetTimeout(maskReveal, 6700);\n\t\t\t\tsetTimeout(showText3, 7000);\n\t\t\t\tsetTimeout(hideText3, 10000);\n\t\t\t\tsetTimeout(resolve, 10500);\n\t\t\t\tsetTimeout(stop, 10900);\n\t\t\t}\n\t\t\t\n\t\t\tfunction basic() {\n\t\t\t\tscreen1.attr({opacity: 0});\n\t\t\t\theart.el.attr({opacity: 0});\n\t\t\t\treplayBtn.attr({opacity: 0});\n\t\t\t\tlogo.show();\n\t\t\t\ttext4.select('tspan').attr({opacity: 0});\n\t\t\t\ttext4.select('tspan:nth-child(2)').attr({y: 120});\n\t\t\t\tresolveScreen.attr({opacity: 1});\n\t\t\t}\n\t\t\t\n\t\t\tif (window.replay !== true) {\n\t\t\t\treplayBtn.attr({opacity: 0});\n\t\t\t}\n\t\t\t\n\t\t\tif (window.supported !== false) {\n\t\t\t\trun();\n\t\t\t} else {\n\t\t\t\tbasic();\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\treturn App;\n});\n/*global require*/\n\nrequire.config({\n    shim: {\n\n    },\n    paths: {\n\t    snap: 'vendor/snap.svg',\n\t    tweenlite: 'vendor/greensock/TweenLite',\n\t    timelinelite: 'vendor/greensock/TimelineLite'\n    }\n});\n\n/**\n* check support\n*/\nwindow.ua = navigator.userAgent.toLowerCase();\nwindow.isAndroid = ua.indexOf(\"android\") > -1;\nwindow.isSafari = ua.indexOf(\"safari\") > -1 && ua.indexOf(\"chrome\") === -1;\n\nfunction checkSVG() {\n\treturn !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n}\n\n/**\n* check mobile\n*/\nwindow.mobilecheck = function() {\n\tvar check = false;\n\t(function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|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/i.test(a)||/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(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)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n\treturn check; \n}\n\nfunction addFallback() {\n\tvar link,\n\t\timg;\n\t\t\n\tlink = document.createElement('a');\n\tlink.href = \"http://snapsvg.io/\";\n\tdocument.body.appendChild(link);\n\t\n\timg = new Image();\n\timg.src = \"backup.jpg\";\n\timg.style.position = \"absolute\";\n\timg.style.top = \"0\";\n\timg.style.left = \"0\";\n\timg.width = \"100%\";\n\tlink.appendChild(img);\n}\n\nwindow.supported = true;\nwindow.replay = true;\n\nrequire(['app/app'], function (App) {\n\t\n\tif (checkSVG() !== true) {\n\t\taddFallback();\n\t\treturn;\n\t}\n\n\tif (isAndroid === true) {\n\t\twindow.supported = false;\n\t}\n\n\tif (isSafari === true) {\n\t\twindow.replay = false;\n\t}\n\t\n\twindow.app = new App();\n\t//app.init(); //fired from font loading\n});\n\n\n\n/**\n* font loading\n*/\nWebFontConfig = {\n\tgoogle: {\n\t\tfamilies: ['Open+Sans:300:latin', 'Source+Sans+Pro::latin']\n\t},\n\tinactive: function () {\n\t\tif (typeof(app) !== 'undefined' && app.started !== true) {\n\t\t\tapp.init();\n\t\t}\n\t},\n\tfontactive: function(familyName, fvd) {\n\t\tif (typeof(app) !== 'undefined' && familyName == 'Open Sans') {\n\t\t\tif (app.started !== true) {\n\t\t\t\tapp.init();\n\t\t\t}\n\t\t}\n\t}\n};\ndefine(\"main\", function(){});\n"
  },
  {
    "path": "demos/snap-ad/site/js/vendor/require.js",
    "content": "/** vim: et:ts=4:sw=4:sts=4\n * @license RequireJS 2.1.5 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 */\n//Not using strict: uneven strict support in browsers, #392, and causes\n//problems with requirejs.exec()/transpiler plugins that may not be strict.\n/*jslint regexp: true, nomen: true, sloppy: true */\n/*global window, navigator, document, importScripts, setTimeout, opera */\n\nvar requirejs, require, define;\n(function (global) {\n    var req, s, head, baseElement, dataMain, src,\n        interactiveScript, currentlyAddingScript, mainScript, subPath,\n        version = '2.1.5',\n        commentRegExp = /(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,\n        cjsRequireRegExp = /[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,\n        jsSuffixRegExp = /\\.js$/,\n        currDirRegExp = /^\\.\\//,\n        op = Object.prototype,\n        ostring = op.toString,\n        hasOwn = op.hasOwnProperty,\n        ap = Array.prototype,\n        apsp = ap.splice,\n        isBrowser = !!(typeof window !== 'undefined' && navigator && document),\n        isWebWorker = !isBrowser && typeof importScripts !== 'undefined',\n        //PS3 indicates loaded and complete, but need to wait for complete\n        //specifically. Sequence is 'loading', 'loaded', execution,\n        // then 'complete'. The UA check is unfortunate, but not sure how\n        //to feature test w/o causing perf issues.\n        readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?\n                      /^complete$/ : /^(complete|loaded)$/,\n        defContextName = '_',\n        //Oh the tragedy, detecting opera. See the usage of isOpera for reason.\n        isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',\n        contexts = {},\n        cfg = {},\n        globalDefQueue = [],\n        useInteractive = false;\n\n    function isFunction(it) {\n        return ostring.call(it) === '[object Function]';\n    }\n\n    function isArray(it) {\n        return ostring.call(it) === '[object Array]';\n    }\n\n    /**\n     * Helper function for iterating over an array. If the func returns\n     * a true value, it will break out of the loop.\n     */\n    function each(ary, func) {\n        if (ary) {\n            var i;\n            for (i = 0; i < ary.length; i += 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Helper function for iterating over an array backwards. If the func\n     * returns a true value, it will break out of the loop.\n     */\n    function eachReverse(ary, func) {\n        if (ary) {\n            var i;\n            for (i = ary.length - 1; i > -1; i -= 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    function getOwn(obj, prop) {\n        return hasProp(obj, prop) && obj[prop];\n    }\n\n    /**\n     * Cycles over properties in an object and calls a function for each\n     * property value. If the function returns a truthy value, then the\n     * iteration is stopped.\n     */\n    function eachProp(obj, func) {\n        var prop;\n        for (prop in obj) {\n            if (hasProp(obj, prop)) {\n                if (func(obj[prop], prop)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Simple function to mix in properties from source into target,\n     * but only if target does not already have a property of the same name.\n     */\n    function mixin(target, source, force, deepStringMixin) {\n        if (source) {\n            eachProp(source, function (value, prop) {\n                if (force || !hasProp(target, prop)) {\n                    if (deepStringMixin && typeof value !== 'string') {\n                        if (!target[prop]) {\n                            target[prop] = {};\n                        }\n                        mixin(target[prop], value, force, deepStringMixin);\n                    } else {\n                        target[prop] = value;\n                    }\n                }\n            });\n        }\n        return target;\n    }\n\n    //Similar to Function.prototype.bind, but the 'this' object is specified\n    //first, since it is easier to read/figure out what 'this' will be.\n    function bind(obj, fn) {\n        return function () {\n            return fn.apply(obj, arguments);\n        };\n    }\n\n    function scripts() {\n        return document.getElementsByTagName('script');\n    }\n\n    //Allow getting a global that expressed in\n    //dot notation, like 'a.b.c'.\n    function getGlobal(value) {\n        if (!value) {\n            return value;\n        }\n        var g = global;\n        each(value.split('.'), function (part) {\n            g = g[part];\n        });\n        return g;\n    }\n\n    /**\n     * Constructs an error with a pointer to an URL with more information.\n     * @param {String} id the error ID that maps to an ID on a web page.\n     * @param {String} message human readable error.\n     * @param {Error} [err] the original error, if there is one.\n     *\n     * @returns {Error}\n     */\n    function makeError(id, msg, err, requireModules) {\n        var e = new Error(msg + '\\nhttp://requirejs.org/docs/errors.html#' + id);\n        e.requireType = id;\n        e.requireModules = requireModules;\n        if (err) {\n            e.originalError = err;\n        }\n        return e;\n    }\n\n    if (typeof define !== 'undefined') {\n        //If a define is already in play via another AMD loader,\n        //do not overwrite.\n        return;\n    }\n\n    if (typeof requirejs !== 'undefined') {\n        if (isFunction(requirejs)) {\n            //Do not overwrite and existing requirejs instance.\n            return;\n        }\n        cfg = requirejs;\n        requirejs = undefined;\n    }\n\n    //Allow for a require config object\n    if (typeof require !== 'undefined' && !isFunction(require)) {\n        //assume it is a config object.\n        cfg = require;\n        require = undefined;\n    }\n\n    function newContext(contextName) {\n        var inCheckLoaded, Module, context, handlers,\n            checkLoadedTimeoutId,\n            config = {\n                //Defaults. Do not set a default for map\n                //config to speed up normalize(), which\n                //will run faster if there is no default.\n                waitSeconds: 7,\n                baseUrl: './',\n                paths: {},\n                pkgs: {},\n                shim: {},\n                config: {}\n            },\n            registry = {},\n            //registry of just enabled modules, to speed\n            //cycle breaking code when lots of modules\n            //are registered, but not activated.\n            enabledRegistry = {},\n            undefEvents = {},\n            defQueue = [],\n            defined = {},\n            urlFetched = {},\n            requireCounter = 1,\n            unnormalizedCounter = 1;\n\n        /**\n         * Trims the . and .. from an array of path segments.\n         * It will keep a leading path segment if a .. will become\n         * the first path segment, to help with module name lookups,\n         * which act like paths, but can be remapped. But the end result,\n         * all paths that use this function should look normalized.\n         * NOTE: this method MODIFIES the input array.\n         * @param {Array} ary the array of path segments.\n         */\n        function trimDots(ary) {\n            var i, part;\n            for (i = 0; ary[i]; i += 1) {\n                part = ary[i];\n                if (part === '.') {\n                    ary.splice(i, 1);\n                    i -= 1;\n                } else if (part === '..') {\n                    if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {\n                        //End of the line. Keep at least one non-dot\n                        //path segment at the front so it can be mapped\n                        //correctly to disk. Otherwise, there is likely\n                        //no path mapping for a path starting with '..'.\n                        //This can still fail, but catches the most reasonable\n                        //uses of ..\n                        break;\n                    } else if (i > 0) {\n                        ary.splice(i - 1, 2);\n                        i -= 2;\n                    }\n                }\n            }\n        }\n\n        /**\n         * Given a relative module name, like ./something, normalize it to\n         * a real name that can be mapped to a path.\n         * @param {String} name the relative name\n         * @param {String} baseName a real name that the name arg is relative\n         * to.\n         * @param {Boolean} applyMap apply the map config to the value. Should\n         * only be done if this normalization is for a dependency ID.\n         * @returns {String} normalized name\n         */\n        function normalize(name, baseName, applyMap) {\n            var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment,\n                foundMap, foundI, foundStarMap, starI,\n                baseParts = baseName && baseName.split('/'),\n                normalizedBaseParts = baseParts,\n                map = config.map,\n                starMap = map && map['*'];\n\n            //Adjust any relative paths.\n            if (name && name.charAt(0) === '.') {\n                //If have a base name, try to normalize against it,\n                //otherwise, assume it is a top-level require that will\n                //be relative to baseUrl in the end.\n                if (baseName) {\n                    if (getOwn(config.pkgs, baseName)) {\n                        //If the baseName is a package name, then just treat it as one\n                        //name to concat the name with.\n                        normalizedBaseParts = baseParts = [baseName];\n                    } else {\n                        //Convert baseName to array, and lop off the last part,\n                        //so that . matches that 'directory' and not name of the baseName's\n                        //module. For instance, baseName of 'one/two/three', maps to\n                        //'one/two/three.js', but we want the directory, 'one/two' for\n                        //this normalization.\n                        normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                    }\n\n                    name = normalizedBaseParts.concat(name.split('/'));\n                    trimDots(name);\n\n                    //Some use of packages may use a . path to reference the\n                    //'main' module name, so normalize for that.\n                    pkgConfig = getOwn(config.pkgs, (pkgName = name[0]));\n                    name = name.join('/');\n                    if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {\n                        name = pkgName;\n                    }\n                } else if (name.indexOf('./') === 0) {\n                    // No baseName, so this is ID is resolved relative\n                    // to baseUrl, pull off the leading dot.\n                    name = name.substring(2);\n                }\n            }\n\n            //Apply map config if available.\n            if (applyMap && map && (baseParts || starMap)) {\n                nameParts = name.split('/');\n\n                for (i = nameParts.length; i > 0; i -= 1) {\n                    nameSegment = nameParts.slice(0, i).join('/');\n\n                    if (baseParts) {\n                        //Find the longest baseName segment match in the config.\n                        //So, do joins on the biggest to smallest lengths of baseParts.\n                        for (j = baseParts.length; j > 0; j -= 1) {\n                            mapValue = getOwn(map, baseParts.slice(0, j).join('/'));\n\n                            //baseName segment has config, find if it has one for\n                            //this name.\n                            if (mapValue) {\n                                mapValue = getOwn(mapValue, nameSegment);\n                                if (mapValue) {\n                                    //Match, update name to the new value.\n                                    foundMap = mapValue;\n                                    foundI = i;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    if (foundMap) {\n                        break;\n                    }\n\n                    //Check for a star map match, but just hold on to it,\n                    //if there is a shorter segment match later in a matching\n                    //config, then favor over this star map.\n                    if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {\n                        foundStarMap = getOwn(starMap, nameSegment);\n                        starI = i;\n                    }\n                }\n\n                if (!foundMap && foundStarMap) {\n                    foundMap = foundStarMap;\n                    foundI = starI;\n                }\n\n                if (foundMap) {\n                    nameParts.splice(0, foundI, foundMap);\n                    name = nameParts.join('/');\n                }\n            }\n\n            return name;\n        }\n\n        function removeScript(name) {\n            if (isBrowser) {\n                each(scripts(), function (scriptNode) {\n                    if (scriptNode.getAttribute('data-requiremodule') === name &&\n                            scriptNode.getAttribute('data-requirecontext') === context.contextName) {\n                        scriptNode.parentNode.removeChild(scriptNode);\n                        return true;\n                    }\n                });\n            }\n        }\n\n        function hasPathFallback(id) {\n            var pathConfig = getOwn(config.paths, id);\n            if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {\n                removeScript(id);\n                //Pop off the first array value, since it failed, and\n                //retry\n                pathConfig.shift();\n                context.require.undef(id);\n                context.require([id]);\n                return true;\n            }\n        }\n\n        //Turns a plugin!resource to [plugin, resource]\n        //with the plugin being undefined if the name\n        //did not have a plugin prefix.\n        function splitPrefix(name) {\n            var prefix,\n                index = name ? name.indexOf('!') : -1;\n            if (index > -1) {\n                prefix = name.substring(0, index);\n                name = name.substring(index + 1, name.length);\n            }\n            return [prefix, name];\n        }\n\n        /**\n         * Creates a module mapping that includes plugin prefix, module\n         * name, and path. If parentModuleMap is provided it will\n         * also normalize the name via require.normalize()\n         *\n         * @param {String} name the module name\n         * @param {String} [parentModuleMap] parent module map\n         * for the module name, used to resolve relative names.\n         * @param {Boolean} isNormalized: is the ID already normalized.\n         * This is true if this call is done for a define() module ID.\n         * @param {Boolean} applyMap: apply the map config to the ID.\n         * Should only be true if this map is for a dependency.\n         *\n         * @returns {Object}\n         */\n        function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {\n            var url, pluginModule, suffix, nameParts,\n                prefix = null,\n                parentName = parentModuleMap ? parentModuleMap.name : null,\n                originalName = name,\n                isDefine = true,\n                normalizedName = '';\n\n            //If no name, then it means it is a require call, generate an\n            //internal name.\n            if (!name) {\n                isDefine = false;\n                name = '_@r' + (requireCounter += 1);\n            }\n\n            nameParts = splitPrefix(name);\n            prefix = nameParts[0];\n            name = nameParts[1];\n\n            if (prefix) {\n                prefix = normalize(prefix, parentName, applyMap);\n                pluginModule = getOwn(defined, prefix);\n            }\n\n            //Account for relative paths if there is a base name.\n            if (name) {\n                if (prefix) {\n                    if (pluginModule && pluginModule.normalize) {\n                        //Plugin is loaded, use its normalize method.\n                        normalizedName = pluginModule.normalize(name, function (name) {\n                            return normalize(name, parentName, applyMap);\n                        });\n                    } else {\n                        normalizedName = normalize(name, parentName, applyMap);\n                    }\n                } else {\n                    //A regular module.\n                    normalizedName = normalize(name, parentName, applyMap);\n\n                    //Normalized name may be a plugin ID due to map config\n                    //application in normalize. The map config values must\n                    //already be normalized, so do not need to redo that part.\n                    nameParts = splitPrefix(normalizedName);\n                    prefix = nameParts[0];\n                    normalizedName = nameParts[1];\n                    isNormalized = true;\n\n                    url = context.nameToUrl(normalizedName);\n                }\n            }\n\n            //If the id is a plugin id that cannot be determined if it needs\n            //normalization, stamp it with a unique ID so two matching relative\n            //ids that may conflict can be separate.\n            suffix = prefix && !pluginModule && !isNormalized ?\n                     '_unnormalized' + (unnormalizedCounter += 1) :\n                     '';\n\n            return {\n                prefix: prefix,\n                name: normalizedName,\n                parentMap: parentModuleMap,\n                unnormalized: !!suffix,\n                url: url,\n                originalName: originalName,\n                isDefine: isDefine,\n                id: (prefix ?\n                        prefix + '!' + normalizedName :\n                        normalizedName) + suffix\n            };\n        }\n\n        function getModule(depMap) {\n            var id = depMap.id,\n                mod = getOwn(registry, id);\n\n            if (!mod) {\n                mod = registry[id] = new context.Module(depMap);\n            }\n\n            return mod;\n        }\n\n        function on(depMap, name, fn) {\n            var id = depMap.id,\n                mod = getOwn(registry, id);\n\n            if (hasProp(defined, id) &&\n                    (!mod || mod.defineEmitComplete)) {\n                if (name === 'defined') {\n                    fn(defined[id]);\n                }\n            } else {\n                getModule(depMap).on(name, fn);\n            }\n        }\n\n        function onError(err, errback) {\n            var ids = err.requireModules,\n                notified = false;\n\n            if (errback) {\n                errback(err);\n            } else {\n                each(ids, function (id) {\n                    var mod = getOwn(registry, id);\n                    if (mod) {\n                        //Set error on module, so it skips timeout checks.\n                        mod.error = err;\n                        if (mod.events.error) {\n                            notified = true;\n                            mod.emit('error', err);\n                        }\n                    }\n                });\n\n                if (!notified) {\n                    req.onError(err);\n                }\n            }\n        }\n\n        /**\n         * Internal method to transfer globalQueue items to this context's\n         * defQueue.\n         */\n        function takeGlobalQueue() {\n            //Push all the globalDefQueue items into the context's defQueue\n            if (globalDefQueue.length) {\n                //Array splice in the values since the context code has a\n                //local var ref to defQueue, so cannot just reassign the one\n                //on context.\n                apsp.apply(defQueue,\n                           [defQueue.length - 1, 0].concat(globalDefQueue));\n                globalDefQueue = [];\n            }\n        }\n\n        handlers = {\n            'require': function (mod) {\n                if (mod.require) {\n                    return mod.require;\n                } else {\n                    return (mod.require = context.makeRequire(mod.map));\n                }\n            },\n            'exports': function (mod) {\n                mod.usingExports = true;\n                if (mod.map.isDefine) {\n                    if (mod.exports) {\n                        return mod.exports;\n                    } else {\n                        return (mod.exports = defined[mod.map.id] = {});\n                    }\n                }\n            },\n            'module': function (mod) {\n                if (mod.module) {\n                    return mod.module;\n                } else {\n                    return (mod.module = {\n                        id: mod.map.id,\n                        uri: mod.map.url,\n                        config: function () {\n                            return (config.config && getOwn(config.config, mod.map.id)) || {};\n                        },\n                        exports: defined[mod.map.id]\n                    });\n                }\n            }\n        };\n\n        function cleanRegistry(id) {\n            //Clean up machinery used for waiting modules.\n            delete registry[id];\n            delete enabledRegistry[id];\n        }\n\n        function breakCycle(mod, traced, processed) {\n            var id = mod.map.id;\n\n            if (mod.error) {\n                mod.emit('error', mod.error);\n            } else {\n                traced[id] = true;\n                each(mod.depMaps, function (depMap, i) {\n                    var depId = depMap.id,\n                        dep = getOwn(registry, depId);\n\n                    //Only force things that have not completed\n                    //being defined, so still in the registry,\n                    //and only if it has not been matched up\n                    //in the module already.\n                    if (dep && !mod.depMatched[i] && !processed[depId]) {\n                        if (getOwn(traced, depId)) {\n                            mod.defineDep(i, defined[depId]);\n                            mod.check(); //pass false?\n                        } else {\n                            breakCycle(dep, traced, processed);\n                        }\n                    }\n                });\n                processed[id] = true;\n            }\n        }\n\n        function checkLoaded() {\n            var map, modId, err, usingPathFallback,\n                waitInterval = config.waitSeconds * 1000,\n                //It is possible to disable the wait interval by using waitSeconds of 0.\n                expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),\n                noLoads = [],\n                reqCalls = [],\n                stillLoading = false,\n                needCycleCheck = true;\n\n            //Do not bother if this call was a result of a cycle break.\n            if (inCheckLoaded) {\n                return;\n            }\n\n            inCheckLoaded = true;\n\n            //Figure out the state of all the modules.\n            eachProp(enabledRegistry, function (mod) {\n                map = mod.map;\n                modId = map.id;\n\n                //Skip things that are not enabled or in error state.\n                if (!mod.enabled) {\n                    return;\n                }\n\n                if (!map.isDefine) {\n                    reqCalls.push(mod);\n                }\n\n                if (!mod.error) {\n                    //If the module should be executed, and it has not\n                    //been inited and time is up, remember it.\n                    if (!mod.inited && expired) {\n                        if (hasPathFallback(modId)) {\n                            usingPathFallback = true;\n                            stillLoading = true;\n                        } else {\n                            noLoads.push(modId);\n                            removeScript(modId);\n                        }\n                    } else if (!mod.inited && mod.fetched && map.isDefine) {\n                        stillLoading = true;\n                        if (!map.prefix) {\n                            //No reason to keep looking for unfinished\n                            //loading. If the only stillLoading is a\n                            //plugin resource though, keep going,\n                            //because it may be that a plugin resource\n                            //is waiting on a non-plugin cycle.\n                            return (needCycleCheck = false);\n                        }\n                    }\n                }\n            });\n\n            if (expired && noLoads.length) {\n                //If wait time expired, throw error of unloaded modules.\n                err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);\n                err.contextName = context.contextName;\n                return onError(err);\n            }\n\n            //Not expired, check for a cycle.\n            if (needCycleCheck) {\n                each(reqCalls, function (mod) {\n                    breakCycle(mod, {}, {});\n                });\n            }\n\n            //If still waiting on loads, and the waiting load is something\n            //other than a plugin resource, or there are still outstanding\n            //scripts, then just try back later.\n            if ((!expired || usingPathFallback) && stillLoading) {\n                //Something is still waiting to load. Wait for it, but only\n                //if a timeout is not already in effect.\n                if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {\n                    checkLoadedTimeoutId = setTimeout(function () {\n                        checkLoadedTimeoutId = 0;\n                        checkLoaded();\n                    }, 50);\n                }\n            }\n\n            inCheckLoaded = false;\n        }\n\n        Module = function (map) {\n            this.events = getOwn(undefEvents, map.id) || {};\n            this.map = map;\n            this.shim = getOwn(config.shim, map.id);\n            this.depExports = [];\n            this.depMaps = [];\n            this.depMatched = [];\n            this.pluginMaps = {};\n            this.depCount = 0;\n\n            /* this.exports this.factory\n               this.depMaps = [],\n               this.enabled, this.fetched\n            */\n        };\n\n        Module.prototype = {\n            init: function (depMaps, factory, errback, options) {\n                options = options || {};\n\n                //Do not do more inits if already done. Can happen if there\n                //are multiple define calls for the same module. That is not\n                //a normal, common case, but it is also not unexpected.\n                if (this.inited) {\n                    return;\n                }\n\n                this.factory = factory;\n\n                if (errback) {\n                    //Register for errors on this module.\n                    this.on('error', errback);\n                } else if (this.events.error) {\n                    //If no errback already, but there are error listeners\n                    //on this module, set up an errback to pass to the deps.\n                    errback = bind(this, function (err) {\n                        this.emit('error', err);\n                    });\n                }\n\n                //Do a copy of the dependency array, so that\n                //source inputs are not modified. For example\n                //\"shim\" deps are passed in here directly, and\n                //doing a direct modification of the depMaps array\n                //would affect that config.\n                this.depMaps = depMaps && depMaps.slice(0);\n\n                this.errback = errback;\n\n                //Indicate this module has be initialized\n                this.inited = true;\n\n                this.ignore = options.ignore;\n\n                //Could have option to init this module in enabled mode,\n                //or could have been previously marked as enabled. However,\n                //the dependencies are not known until init is called. So\n                //if enabled previously, now trigger dependencies as enabled.\n                if (options.enabled || this.enabled) {\n                    //Enable this module and dependencies.\n                    //Will call this.check()\n                    this.enable();\n                } else {\n                    this.check();\n                }\n            },\n\n            defineDep: function (i, depExports) {\n                //Because of cycles, defined callback for a given\n                //export can be called more than once.\n                if (!this.depMatched[i]) {\n                    this.depMatched[i] = true;\n                    this.depCount -= 1;\n                    this.depExports[i] = depExports;\n                }\n            },\n\n            fetch: function () {\n                if (this.fetched) {\n                    return;\n                }\n                this.fetched = true;\n\n                context.startTime = (new Date()).getTime();\n\n                var map = this.map;\n\n                //If the manager is for a plugin managed resource,\n                //ask the plugin to load it now.\n                if (this.shim) {\n                    context.makeRequire(this.map, {\n                        enableBuildCallback: true\n                    })(this.shim.deps || [], bind(this, function () {\n                        return map.prefix ? this.callPlugin() : this.load();\n                    }));\n                } else {\n                    //Regular dependency.\n                    return map.prefix ? this.callPlugin() : this.load();\n                }\n            },\n\n            load: function () {\n                var url = this.map.url;\n\n                //Regular dependency.\n                if (!urlFetched[url]) {\n                    urlFetched[url] = true;\n                    context.load(this.map.id, url);\n                }\n            },\n\n            /**\n             * Checks if the module is ready to define itself, and if so,\n             * define it.\n             */\n            check: function () {\n                if (!this.enabled || this.enabling) {\n                    return;\n                }\n\n                var err, cjsModule,\n                    id = this.map.id,\n                    depExports = this.depExports,\n                    exports = this.exports,\n                    factory = this.factory;\n\n                if (!this.inited) {\n                    this.fetch();\n                } else if (this.error) {\n                    this.emit('error', this.error);\n                } else if (!this.defining) {\n                    //The factory could trigger another require call\n                    //that would result in checking this module to\n                    //define itself again. If already in the process\n                    //of doing that, skip this work.\n                    this.defining = true;\n\n                    if (this.depCount < 1 && !this.defined) {\n                        if (isFunction(factory)) {\n                            //If there is an error listener, favor passing\n                            //to that instead of throwing an error.\n                            if (this.events.error) {\n                                try {\n                                    exports = context.execCb(id, factory, depExports, exports);\n                                } catch (e) {\n                                    err = e;\n                                }\n                            } else {\n                                exports = context.execCb(id, factory, depExports, exports);\n                            }\n\n                            if (this.map.isDefine) {\n                                //If setting exports via 'module' is in play,\n                                //favor that over return value and exports. After that,\n                                //favor a non-undefined return value over exports use.\n                                cjsModule = this.module;\n                                if (cjsModule &&\n                                        cjsModule.exports !== undefined &&\n                                        //Make sure it is not already the exports value\n                                        cjsModule.exports !== this.exports) {\n                                    exports = cjsModule.exports;\n                                } else if (exports === undefined && this.usingExports) {\n                                    //exports already set the defined value.\n                                    exports = this.exports;\n                                }\n                            }\n\n                            if (err) {\n                                err.requireMap = this.map;\n                                err.requireModules = [this.map.id];\n                                err.requireType = 'define';\n                                return onError((this.error = err));\n                            }\n\n                        } else {\n                            //Just a literal value\n                            exports = factory;\n                        }\n\n                        this.exports = exports;\n\n                        if (this.map.isDefine && !this.ignore) {\n                            defined[id] = exports;\n\n                            if (req.onResourceLoad) {\n                                req.onResourceLoad(context, this.map, this.depMaps);\n                            }\n                        }\n\n                        //Clean up\n                        cleanRegistry(id);\n\n                        this.defined = true;\n                    }\n\n                    //Finished the define stage. Allow calling check again\n                    //to allow define notifications below in the case of a\n                    //cycle.\n                    this.defining = false;\n\n                    if (this.defined && !this.defineEmitted) {\n                        this.defineEmitted = true;\n                        this.emit('defined', this.exports);\n                        this.defineEmitComplete = true;\n                    }\n\n                }\n            },\n\n            callPlugin: function () {\n                var map = this.map,\n                    id = map.id,\n                    //Map already normalized the prefix.\n                    pluginMap = makeModuleMap(map.prefix);\n\n                //Mark this as a dependency for this plugin, so it\n                //can be traced for cycles.\n                this.depMaps.push(pluginMap);\n\n                on(pluginMap, 'defined', bind(this, function (plugin) {\n                    var load, normalizedMap, normalizedMod,\n                        name = this.map.name,\n                        parentName = this.map.parentMap ? this.map.parentMap.name : null,\n                        localRequire = context.makeRequire(map.parentMap, {\n                            enableBuildCallback: true\n                        });\n\n                    //If current map is not normalized, wait for that\n                    //normalized name to load instead of continuing.\n                    if (this.map.unnormalized) {\n                        //Normalize the ID if the plugin allows it.\n                        if (plugin.normalize) {\n                            name = plugin.normalize(name, function (name) {\n                                return normalize(name, parentName, true);\n                            }) || '';\n                        }\n\n                        //prefix and name should already be normalized, no need\n                        //for applying map config again either.\n                        normalizedMap = makeModuleMap(map.prefix + '!' + name,\n                                                      this.map.parentMap);\n                        on(normalizedMap,\n                            'defined', bind(this, function (value) {\n                                this.init([], function () { return value; }, null, {\n                                    enabled: true,\n                                    ignore: true\n                                });\n                            }));\n\n                        normalizedMod = getOwn(registry, normalizedMap.id);\n                        if (normalizedMod) {\n                            //Mark this as a dependency for this plugin, so it\n                            //can be traced for cycles.\n                            this.depMaps.push(normalizedMap);\n\n                            if (this.events.error) {\n                                normalizedMod.on('error', bind(this, function (err) {\n                                    this.emit('error', err);\n                                }));\n                            }\n                            normalizedMod.enable();\n                        }\n\n                        return;\n                    }\n\n                    load = bind(this, function (value) {\n                        this.init([], function () { return value; }, null, {\n                            enabled: true\n                        });\n                    });\n\n                    load.error = bind(this, function (err) {\n                        this.inited = true;\n                        this.error = err;\n                        err.requireModules = [id];\n\n                        //Remove temp unnormalized modules for this module,\n                        //since they will never be resolved otherwise now.\n                        eachProp(registry, function (mod) {\n                            if (mod.map.id.indexOf(id + '_unnormalized') === 0) {\n                                cleanRegistry(mod.map.id);\n                            }\n                        });\n\n                        onError(err);\n                    });\n\n                    //Allow plugins to load other code without having to know the\n                    //context or how to 'complete' the load.\n                    load.fromText = bind(this, function (text, textAlt) {\n                        /*jslint evil: true */\n                        var moduleName = map.name,\n                            moduleMap = makeModuleMap(moduleName),\n                            hasInteractive = useInteractive;\n\n                        //As of 2.1.0, support just passing the text, to reinforce\n                        //fromText only being called once per resource. Still\n                        //support old style of passing moduleName but discard\n                        //that moduleName in favor of the internal ref.\n                        if (textAlt) {\n                            text = textAlt;\n                        }\n\n                        //Turn off interactive script matching for IE for any define\n                        //calls in the text, then turn it back on at the end.\n                        if (hasInteractive) {\n                            useInteractive = false;\n                        }\n\n                        //Prime the system by creating a module instance for\n                        //it.\n                        getModule(moduleMap);\n\n                        //Transfer any config to this other module.\n                        if (hasProp(config.config, id)) {\n                            config.config[moduleName] = config.config[id];\n                        }\n\n                        try {\n                            req.exec(text);\n                        } catch (e) {\n                            return onError(makeError('fromtexteval',\n                                             'fromText eval for ' + id +\n                                            ' failed: ' + e,\n                                             e,\n                                             [id]));\n                        }\n\n                        if (hasInteractive) {\n                            useInteractive = true;\n                        }\n\n                        //Mark this as a dependency for the plugin\n                        //resource\n                        this.depMaps.push(moduleMap);\n\n                        //Support anonymous modules.\n                        context.completeLoad(moduleName);\n\n                        //Bind the value of that module to the value for this\n                        //resource ID.\n                        localRequire([moduleName], load);\n                    });\n\n                    //Use parentName here since the plugin's name is not reliable,\n                    //could be some weird string with no path that actually wants to\n                    //reference the parentName's path.\n                    plugin.load(map.name, localRequire, load, config);\n                }));\n\n                context.enable(pluginMap, this);\n                this.pluginMaps[pluginMap.id] = pluginMap;\n            },\n\n            enable: function () {\n                enabledRegistry[this.map.id] = this;\n                this.enabled = true;\n\n                //Set flag mentioning that the module is enabling,\n                //so that immediate calls to the defined callbacks\n                //for dependencies do not trigger inadvertent load\n                //with the depCount still being zero.\n                this.enabling = true;\n\n                //Enable each dependency\n                each(this.depMaps, bind(this, function (depMap, i) {\n                    var id, mod, handler;\n\n                    if (typeof depMap === 'string') {\n                        //Dependency needs to be converted to a depMap\n                        //and wired up to this module.\n                        depMap = makeModuleMap(depMap,\n                                               (this.map.isDefine ? this.map : this.map.parentMap),\n                                               false,\n                                               !this.skipMap);\n                        this.depMaps[i] = depMap;\n\n                        handler = getOwn(handlers, depMap.id);\n\n                        if (handler) {\n                            this.depExports[i] = handler(this);\n                            return;\n                        }\n\n                        this.depCount += 1;\n\n                        on(depMap, 'defined', bind(this, function (depExports) {\n                            this.defineDep(i, depExports);\n                            this.check();\n                        }));\n\n                        if (this.errback) {\n                            on(depMap, 'error', this.errback);\n                        }\n                    }\n\n                    id = depMap.id;\n                    mod = registry[id];\n\n                    //Skip special modules like 'require', 'exports', 'module'\n                    //Also, don't call enable if it is already enabled,\n                    //important in circular dependency cases.\n                    if (!hasProp(handlers, id) && mod && !mod.enabled) {\n                        context.enable(depMap, this);\n                    }\n                }));\n\n                //Enable each plugin that is used in\n                //a dependency\n                eachProp(this.pluginMaps, bind(this, function (pluginMap) {\n                    var mod = getOwn(registry, pluginMap.id);\n                    if (mod && !mod.enabled) {\n                        context.enable(pluginMap, this);\n                    }\n                }));\n\n                this.enabling = false;\n\n                this.check();\n            },\n\n            on: function (name, cb) {\n                var cbs = this.events[name];\n                if (!cbs) {\n                    cbs = this.events[name] = [];\n                }\n                cbs.push(cb);\n            },\n\n            emit: function (name, evt) {\n                each(this.events[name], function (cb) {\n                    cb(evt);\n                });\n                if (name === 'error') {\n                    //Now that the error handler was triggered, remove\n                    //the listeners, since this broken Module instance\n                    //can stay around for a while in the registry.\n                    delete this.events[name];\n                }\n            }\n        };\n\n        function callGetModule(args) {\n            //Skip modules already defined.\n            if (!hasProp(defined, args[0])) {\n                getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);\n            }\n        }\n\n        function removeListener(node, func, name, ieName) {\n            //Favor detachEvent because of IE9\n            //issue, see attachEvent/addEventListener comment elsewhere\n            //in this file.\n            if (node.detachEvent && !isOpera) {\n                //Probably IE. If not it will throw an error, which will be\n                //useful to know.\n                if (ieName) {\n                    node.detachEvent(ieName, func);\n                }\n            } else {\n                node.removeEventListener(name, func, false);\n            }\n        }\n\n        /**\n         * Given an event from a script node, get the requirejs info from it,\n         * and then removes the event listeners on the node.\n         * @param {Event} evt\n         * @returns {Object}\n         */\n        function getScriptData(evt) {\n            //Using currentTarget instead of target for Firefox 2.0's sake. Not\n            //all old browsers will be supported, but this one was easy enough\n            //to support and still makes sense.\n            var node = evt.currentTarget || evt.srcElement;\n\n            //Remove the listeners once here.\n            removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');\n            removeListener(node, context.onScriptError, 'error');\n\n            return {\n                node: node,\n                id: node && node.getAttribute('data-requiremodule')\n            };\n        }\n\n        function intakeDefines() {\n            var args;\n\n            //Any defined modules in the global queue, intake them now.\n            takeGlobalQueue();\n\n            //Make sure any remaining defQueue items get properly processed.\n            while (defQueue.length) {\n                args = defQueue.shift();\n                if (args[0] === null) {\n                    return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));\n                } else {\n                    //args are id, deps, factory. Should be normalized by the\n                    //define() function.\n                    callGetModule(args);\n                }\n            }\n        }\n\n        context = {\n            config: config,\n            contextName: contextName,\n            registry: registry,\n            defined: defined,\n            urlFetched: urlFetched,\n            defQueue: defQueue,\n            Module: Module,\n            makeModuleMap: makeModuleMap,\n            nextTick: req.nextTick,\n            onError: onError,\n\n            /**\n             * Set a configuration for the context.\n             * @param {Object} cfg config object to integrate.\n             */\n            configure: function (cfg) {\n                //Make sure the baseUrl ends in a slash.\n                if (cfg.baseUrl) {\n                    if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {\n                        cfg.baseUrl += '/';\n                    }\n                }\n\n                //Save off the paths and packages since they require special processing,\n                //they are additive.\n                var pkgs = config.pkgs,\n                    shim = config.shim,\n                    objs = {\n                        paths: true,\n                        config: true,\n                        map: true\n                    };\n\n                eachProp(cfg, function (value, prop) {\n                    if (objs[prop]) {\n                        if (prop === 'map') {\n                            if (!config.map) {\n                                config.map = {};\n                            }\n                            mixin(config[prop], value, true, true);\n                        } else {\n                            mixin(config[prop], value, true);\n                        }\n                    } else {\n                        config[prop] = value;\n                    }\n                });\n\n                //Merge shim\n                if (cfg.shim) {\n                    eachProp(cfg.shim, function (value, id) {\n                        //Normalize the structure\n                        if (isArray(value)) {\n                            value = {\n                                deps: value\n                            };\n                        }\n                        if ((value.exports || value.init) && !value.exportsFn) {\n                            value.exportsFn = context.makeShimExports(value);\n                        }\n                        shim[id] = value;\n                    });\n                    config.shim = shim;\n                }\n\n                //Adjust packages if necessary.\n                if (cfg.packages) {\n                    each(cfg.packages, function (pkgObj) {\n                        var location;\n\n                        pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;\n                        location = pkgObj.location;\n\n                        //Create a brand new object on pkgs, since currentPackages can\n                        //be passed in again, and config.pkgs is the internal transformed\n                        //state for all package configs.\n                        pkgs[pkgObj.name] = {\n                            name: pkgObj.name,\n                            location: location || pkgObj.name,\n                            //Remove leading dot in main, so main paths are normalized,\n                            //and remove any trailing .js, since different package\n                            //envs have different conventions: some use a module name,\n                            //some use a file name.\n                            main: (pkgObj.main || 'main')\n                                  .replace(currDirRegExp, '')\n                                  .replace(jsSuffixRegExp, '')\n                        };\n                    });\n\n                    //Done with modifications, assing packages back to context config\n                    config.pkgs = pkgs;\n                }\n\n                //If there are any \"waiting to execute\" modules in the registry,\n                //update the maps for them, since their info, like URLs to load,\n                //may have changed.\n                eachProp(registry, function (mod, id) {\n                    //If module already has init called, since it is too\n                    //late to modify them, and ignore unnormalized ones\n                    //since they are transient.\n                    if (!mod.inited && !mod.map.unnormalized) {\n                        mod.map = makeModuleMap(id);\n                    }\n                });\n\n                //If a deps array or a config callback is specified, then call\n                //require with those args. This is useful when require is defined as a\n                //config object before require.js is loaded.\n                if (cfg.deps || cfg.callback) {\n                    context.require(cfg.deps || [], cfg.callback);\n                }\n            },\n\n            makeShimExports: function (value) {\n                function fn() {\n                    var ret;\n                    if (value.init) {\n                        ret = value.init.apply(global, arguments);\n                    }\n                    return ret || (value.exports && getGlobal(value.exports));\n                }\n                return fn;\n            },\n\n            makeRequire: function (relMap, options) {\n                options = options || {};\n\n                function localRequire(deps, callback, errback) {\n                    var id, map, requireMod;\n\n                    if (options.enableBuildCallback && callback && isFunction(callback)) {\n                        callback.__requireJsBuild = true;\n                    }\n\n                    if (typeof deps === 'string') {\n                        if (isFunction(callback)) {\n                            //Invalid call\n                            return onError(makeError('requireargs', 'Invalid require call'), errback);\n                        }\n\n                        //If require|exports|module are requested, get the\n                        //value for them from the special handlers. Caveat:\n                        //this only works while module is being defined.\n                        if (relMap && hasProp(handlers, deps)) {\n                            return handlers[deps](registry[relMap.id]);\n                        }\n\n                        //Synchronous access to one module. If require.get is\n                        //available (as in the Node adapter), prefer that.\n                        if (req.get) {\n                            return req.get(context, deps, relMap, localRequire);\n                        }\n\n                        //Normalize module name, if it contains . or ..\n                        map = makeModuleMap(deps, relMap, false, true);\n                        id = map.id;\n\n                        if (!hasProp(defined, id)) {\n                            return onError(makeError('notloaded', 'Module name \"' +\n                                        id +\n                                        '\" has not been loaded yet for context: ' +\n                                        contextName +\n                                        (relMap ? '' : '. Use require([])')));\n                        }\n                        return defined[id];\n                    }\n\n                    //Grab defines waiting in the global queue.\n                    intakeDefines();\n\n                    //Mark all the dependencies as needing to be loaded.\n                    context.nextTick(function () {\n                        //Some defines could have been added since the\n                        //require call, collect them.\n                        intakeDefines();\n\n                        requireMod = getModule(makeModuleMap(null, relMap));\n\n                        //Store if map config should be applied to this require\n                        //call for dependencies.\n                        requireMod.skipMap = options.skipMap;\n\n                        requireMod.init(deps, callback, errback, {\n                            enabled: true\n                        });\n\n                        checkLoaded();\n                    });\n\n                    return localRequire;\n                }\n\n                mixin(localRequire, {\n                    isBrowser: isBrowser,\n\n                    /**\n                     * Converts a module name + .extension into an URL path.\n                     * *Requires* the use of a module name. It does not support using\n                     * plain URLs like nameToUrl.\n                     */\n                    toUrl: function (moduleNamePlusExt) {\n                        var ext,\n                            index = moduleNamePlusExt.lastIndexOf('.'),\n                            segment = moduleNamePlusExt.split('/')[0],\n                            isRelative = segment === '.' || segment === '..';\n\n                        //Have a file extension alias, and it is not the\n                        //dots from a relative path.\n                        if (index !== -1 && (!isRelative || index > 1)) {\n                            ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);\n                            moduleNamePlusExt = moduleNamePlusExt.substring(0, index);\n                        }\n\n                        return context.nameToUrl(normalize(moduleNamePlusExt,\n                                                relMap && relMap.id, true), ext,  true);\n                    },\n\n                    defined: function (id) {\n                        return hasProp(defined, makeModuleMap(id, relMap, false, true).id);\n                    },\n\n                    specified: function (id) {\n                        id = makeModuleMap(id, relMap, false, true).id;\n                        return hasProp(defined, id) || hasProp(registry, id);\n                    }\n                });\n\n                //Only allow undef on top level require calls\n                if (!relMap) {\n                    localRequire.undef = function (id) {\n                        //Bind any waiting define() calls to this context,\n                        //fix for #408\n                        takeGlobalQueue();\n\n                        var map = makeModuleMap(id, relMap, true),\n                            mod = getOwn(registry, id);\n\n                        delete defined[id];\n                        delete urlFetched[map.url];\n                        delete undefEvents[id];\n\n                        if (mod) {\n                            //Hold on to listeners in case the\n                            //module will be attempted to be reloaded\n                            //using a different config.\n                            if (mod.events.defined) {\n                                undefEvents[id] = mod.events;\n                            }\n\n                            cleanRegistry(id);\n                        }\n                    };\n                }\n\n                return localRequire;\n            },\n\n            /**\n             * Called to enable a module if it is still in the registry\n             * awaiting enablement. A second arg, parent, the parent module,\n             * is passed in for context, when this method is overriden by\n             * the optimizer. Not shown here to keep code compact.\n             */\n            enable: function (depMap) {\n                var mod = getOwn(registry, depMap.id);\n                if (mod) {\n                    getModule(depMap).enable();\n                }\n            },\n\n            /**\n             * Internal method used by environment adapters to complete a load event.\n             * A load event could be a script load or just a load pass from a synchronous\n             * load call.\n             * @param {String} moduleName the name of the module to potentially complete.\n             */\n            completeLoad: function (moduleName) {\n                var found, args, mod,\n                    shim = getOwn(config.shim, moduleName) || {},\n                    shExports = shim.exports;\n\n                takeGlobalQueue();\n\n                while (defQueue.length) {\n                    args = defQueue.shift();\n                    if (args[0] === null) {\n                        args[0] = moduleName;\n                        //If already found an anonymous module and bound it\n                        //to this name, then this is some other anon module\n                        //waiting for its completeLoad to fire.\n                        if (found) {\n                            break;\n                        }\n                        found = true;\n                    } else if (args[0] === moduleName) {\n                        //Found matching define call for this script!\n                        found = true;\n                    }\n\n                    callGetModule(args);\n                }\n\n                //Do this after the cycle of callGetModule in case the result\n                //of those calls/init calls changes the registry.\n                mod = getOwn(registry, moduleName);\n\n                if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {\n                    if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {\n                        if (hasPathFallback(moduleName)) {\n                            return;\n                        } else {\n                            return onError(makeError('nodefine',\n                                             'No define call for ' + moduleName,\n                                             null,\n                                             [moduleName]));\n                        }\n                    } else {\n                        //A script that does not call define(), so just simulate\n                        //the call for it.\n                        callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);\n                    }\n                }\n\n                checkLoaded();\n            },\n\n            /**\n             * Converts a module name to a file path. Supports cases where\n             * moduleName may actually be just an URL.\n             * Note that it **does not** call normalize on the moduleName,\n             * it is assumed to have already been normalized. This is an\n             * internal API, not a public one. Use toUrl for the public API.\n             */\n            nameToUrl: function (moduleName, ext, skipExt) {\n                var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,\n                    parentPath;\n\n                //If a colon is in the URL, it indicates a protocol is used and it is just\n                //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)\n                //or ends with .js, then assume the user meant to use an url and not a module id.\n                //The slash is important for protocol-less URLs as well as full paths.\n                if (req.jsExtRegExp.test(moduleName)) {\n                    //Just a plain path, not module name lookup, so just return it.\n                    //Add extension if it is included. This is a bit wonky, only non-.js things pass\n                    //an extension, this method probably needs to be reworked.\n                    url = moduleName + (ext || '');\n                } else {\n                    //A module that needs to be converted to a path.\n                    paths = config.paths;\n                    pkgs = config.pkgs;\n\n                    syms = moduleName.split('/');\n                    //For each module name segment, see if there is a path\n                    //registered for it. Start with most specific name\n                    //and work up from it.\n                    for (i = syms.length; i > 0; i -= 1) {\n                        parentModule = syms.slice(0, i).join('/');\n                        pkg = getOwn(pkgs, parentModule);\n                        parentPath = getOwn(paths, parentModule);\n                        if (parentPath) {\n                            //If an array, it means there are a few choices,\n                            //Choose the one that is desired\n                            if (isArray(parentPath)) {\n                                parentPath = parentPath[0];\n                            }\n                            syms.splice(0, i, parentPath);\n                            break;\n                        } else if (pkg) {\n                            //If module name is just the package name, then looking\n                            //for the main module.\n                            if (moduleName === pkg.name) {\n                                pkgPath = pkg.location + '/' + pkg.main;\n                            } else {\n                                pkgPath = pkg.location;\n                            }\n                            syms.splice(0, i, pkgPath);\n                            break;\n                        }\n                    }\n\n                    //Join the path parts together, then figure out if baseUrl is needed.\n                    url = syms.join('/');\n                    url += (ext || (/\\?/.test(url) || skipExt ? '' : '.js'));\n                    url = (url.charAt(0) === '/' || url.match(/^[\\w\\+\\.\\-]+:/) ? '' : config.baseUrl) + url;\n                }\n\n                return config.urlArgs ? url +\n                                        ((url.indexOf('?') === -1 ? '?' : '&') +\n                                         config.urlArgs) : url;\n            },\n\n            //Delegates to req.load. Broken out as a separate function to\n            //allow overriding in the optimizer.\n            load: function (id, url) {\n                req.load(context, id, url);\n            },\n\n            /**\n             * Executes a module callack function. Broken out as a separate function\n             * solely to allow the build system to sequence the files in the built\n             * layer in the right sequence.\n             *\n             * @private\n             */\n            execCb: function (name, callback, args, exports) {\n                return callback.apply(exports, args);\n            },\n\n            /**\n             * callback for script loads, used to check status of loading.\n             *\n             * @param {Event} evt the event from the browser for the script\n             * that was loaded.\n             */\n            onScriptLoad: function (evt) {\n                //Using currentTarget instead of target for Firefox 2.0's sake. Not\n                //all old browsers will be supported, but this one was easy enough\n                //to support and still makes sense.\n                if (evt.type === 'load' ||\n                        (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {\n                    //Reset interactive script so a script node is not held onto for\n                    //to long.\n                    interactiveScript = null;\n\n                    //Pull out the name of the module and the context.\n                    var data = getScriptData(evt);\n                    context.completeLoad(data.id);\n                }\n            },\n\n            /**\n             * Callback for script errors.\n             */\n            onScriptError: function (evt) {\n                var data = getScriptData(evt);\n                if (!hasPathFallback(data.id)) {\n                    return onError(makeError('scripterror', 'Script error', evt, [data.id]));\n                }\n            }\n        };\n\n        context.require = context.makeRequire();\n        return context;\n    }\n\n    /**\n     * Main entry point.\n     *\n     * If the only argument to require is a string, then the module that\n     * is represented by that string is fetched for the appropriate context.\n     *\n     * If the first argument is an array, then it will be treated as an array\n     * of dependency string names to fetch. An optional function callback can\n     * be specified to execute when all of those dependencies are available.\n     *\n     * Make a local req variable to help Caja compliance (it assumes things\n     * on a require that are not standardized), and to give a short\n     * name for minification/local scope use.\n     */\n    req = requirejs = function (deps, callback, errback, optional) {\n\n        //Find the right context, use default\n        var context, config,\n            contextName = defContextName;\n\n        // Determine if have config object in the call.\n        if (!isArray(deps) && typeof deps !== 'string') {\n            // deps is a config object\n            config = deps;\n            if (isArray(callback)) {\n                // Adjust args if there are dependencies\n                deps = callback;\n                callback = errback;\n                errback = optional;\n            } else {\n                deps = [];\n            }\n        }\n\n        if (config && config.context) {\n            contextName = config.context;\n        }\n\n        context = getOwn(contexts, contextName);\n        if (!context) {\n            context = contexts[contextName] = req.s.newContext(contextName);\n        }\n\n        if (config) {\n            context.configure(config);\n        }\n\n        return context.require(deps, callback, errback);\n    };\n\n    /**\n     * Support require.config() to make it easier to cooperate with other\n     * AMD loaders on globally agreed names.\n     */\n    req.config = function (config) {\n        return req(config);\n    };\n\n    /**\n     * Execute something after the current tick\n     * of the event loop. Override for other envs\n     * that have a better solution than setTimeout.\n     * @param  {Function} fn function to execute later.\n     */\n    req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {\n        setTimeout(fn, 4);\n    } : function (fn) { fn(); };\n\n    /**\n     * Export require as a global, but only if it does not already exist.\n     */\n    if (!require) {\n        require = req;\n    }\n\n    req.version = version;\n\n    //Used to filter out dependencies that are already paths.\n    req.jsExtRegExp = /^\\/|:|\\?|\\.js$/;\n    req.isBrowser = isBrowser;\n    s = req.s = {\n        contexts: contexts,\n        newContext: newContext\n    };\n\n    //Create default context.\n    req({});\n\n    //Exports some context-sensitive methods on global require.\n    each([\n        'toUrl',\n        'undef',\n        'defined',\n        'specified'\n    ], function (prop) {\n        //Reference from contexts instead of early binding to default context,\n        //so that during builds, the latest instance of the default context\n        //with its config gets used.\n        req[prop] = function () {\n            var ctx = contexts[defContextName];\n            return ctx.require[prop].apply(ctx, arguments);\n        };\n    });\n\n    if (isBrowser) {\n        head = s.head = document.getElementsByTagName('head')[0];\n        //If BASE tag is in play, using appendChild is a problem for IE6.\n        //When that browser dies, this can be removed. Details in this jQuery bug:\n        //http://dev.jquery.com/ticket/2709\n        baseElement = document.getElementsByTagName('base')[0];\n        if (baseElement) {\n            head = s.head = baseElement.parentNode;\n        }\n    }\n\n    /**\n     * Any errors that require explicitly generates will be passed to this\n     * function. Intercept/override it if you want custom error handling.\n     * @param {Error} err the error object.\n     */\n    req.onError = function (err) {\n        throw err;\n    };\n\n    /**\n     * Does the request to load a module for the browser case.\n     * Make this a separate function to allow other environments\n     * to override it.\n     *\n     * @param {Object} context the require context to find state.\n     * @param {String} moduleName the name of the module.\n     * @param {Object} url the URL to the module.\n     */\n    req.load = function (context, moduleName, url) {\n        var config = (context && context.config) || {},\n            node;\n        if (isBrowser) {\n            //In the browser so use a script tag\n            node = config.xhtml ?\n                    document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :\n                    document.createElement('script');\n            node.type = config.scriptType || 'text/javascript';\n            node.charset = 'utf-8';\n            node.async = true;\n\n            node.setAttribute('data-requirecontext', context.contextName);\n            node.setAttribute('data-requiremodule', moduleName);\n\n            //Set up load listener. Test attachEvent first because IE9 has\n            //a subtle issue in its addEventListener and script onload firings\n            //that do not match the behavior of all other browsers with\n            //addEventListener support, which fire the onload event for a\n            //script right after the script execution. See:\n            //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution\n            //UNFORTUNATELY Opera implements attachEvent but does not follow the script\n            //script execution mode.\n            if (node.attachEvent &&\n                    //Check if node.attachEvent is artificially added by custom script or\n                    //natively supported by browser\n                    //read https://github.com/jrburke/requirejs/issues/187\n                    //if we can NOT find [native code] then it must NOT natively supported.\n                    //in IE8, node.attachEvent does not have toString()\n                    //Note the test for \"[native code\" with no closing brace, see:\n                    //https://github.com/jrburke/requirejs/issues/273\n                    !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&\n                    !isOpera) {\n                //Probably IE. IE (at least 6-8) do not fire\n                //script onload right after executing the script, so\n                //we cannot tie the anonymous define call to a name.\n                //However, IE reports the script as being in 'interactive'\n                //readyState at the time of the define call.\n                useInteractive = true;\n\n                node.attachEvent('onreadystatechange', context.onScriptLoad);\n                //It would be great to add an error handler here to catch\n                //404s in IE9+. However, onreadystatechange will fire before\n                //the error handler, so that does not help. If addEventListener\n                //is used, then IE will fire error before load, but we cannot\n                //use that pathway given the connect.microsoft.com issue\n                //mentioned above about not doing the 'script execute,\n                //then fire the script load event listener before execute\n                //next script' that other browsers do.\n                //Best hope: IE10 fixes the issues,\n                //and then destroys all installs of IE 6-9.\n                //node.attachEvent('onerror', context.onScriptError);\n            } else {\n                node.addEventListener('load', context.onScriptLoad, false);\n                node.addEventListener('error', context.onScriptError, false);\n            }\n            node.src = url;\n\n            //For some cache cases in IE 6-8, the script executes before the end\n            //of the appendChild execution, so to tie an anonymous define\n            //call to the module name (which is stored on the node), hold on\n            //to a reference to this node, but clear after the DOM insertion.\n            currentlyAddingScript = node;\n            if (baseElement) {\n                head.insertBefore(node, baseElement);\n            } else {\n                head.appendChild(node);\n            }\n            currentlyAddingScript = null;\n\n            return node;\n        } else if (isWebWorker) {\n            try {\n                //In a web worker, use importScripts. This is not a very\n                //efficient use of importScripts, importScripts will block until\n                //its script is downloaded and evaluated. However, if web workers\n                //are in play, the expectation that a build has been done so that\n                //only one script needs to be loaded anyway. This may need to be\n                //reevaluated if other use cases become common.\n                importScripts(url);\n\n                //Account for anonymous modules\n                context.completeLoad(moduleName);\n            } catch (e) {\n                context.onError(makeError('importscripts',\n                                'importScripts failed for ' +\n                                    moduleName + ' at ' + url,\n                                e,\n                                [moduleName]));\n            }\n        }\n    };\n\n    function getInteractiveScript() {\n        if (interactiveScript && interactiveScript.readyState === 'interactive') {\n            return interactiveScript;\n        }\n\n        eachReverse(scripts(), function (script) {\n            if (script.readyState === 'interactive') {\n                return (interactiveScript = script);\n            }\n        });\n        return interactiveScript;\n    }\n\n    //Look for a data-main script attribute, which could also adjust the baseUrl.\n    if (isBrowser) {\n        //Figure out baseUrl. Get it from the script tag with require.js in it.\n        eachReverse(scripts(), function (script) {\n            //Set the 'head' where we can append children by\n            //using the script's parent.\n            if (!head) {\n                head = script.parentNode;\n            }\n\n            //Look for a data-main attribute to set main script for the page\n            //to load. If it is there, the path to data main becomes the\n            //baseUrl, if it is not already set.\n            dataMain = script.getAttribute('data-main');\n            if (dataMain) {\n                //Set final baseUrl if there is not already an explicit one.\n                if (!cfg.baseUrl) {\n                    //Pull off the directory of data-main for use as the\n                    //baseUrl.\n                    src = dataMain.split('/');\n                    mainScript = src.pop();\n                    subPath = src.length ? src.join('/')  + '/' : './';\n\n                    cfg.baseUrl = subPath;\n                    dataMain = mainScript;\n                }\n\n                //Strip off any trailing .js since dataMain is now\n                //like a module name.\n                dataMain = dataMain.replace(jsSuffixRegExp, '');\n\n                //Put the data-main script in the files to load.\n                cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];\n\n                return true;\n            }\n        });\n    }\n\n    /**\n     * The function that handles definitions of modules. Differs from\n     * require() in that a string for the module should be the first argument,\n     * and the function to execute after dependencies are loaded should\n     * return a value to define the module corresponding to the first argument's\n     * name.\n     */\n    define = function (name, deps, callback) {\n        var node, context;\n\n        //Allow for anonymous modules\n        if (typeof name !== 'string') {\n            //Adjust args appropriately\n            callback = deps;\n            deps = name;\n            name = null;\n        }\n\n        //This module may not have dependencies\n        if (!isArray(deps)) {\n            callback = deps;\n            deps = [];\n        }\n\n        //If no name, and callback is a function, then figure out if it a\n        //CommonJS thing with dependencies.\n        if (!deps.length && isFunction(callback)) {\n            //Remove comments from the callback string,\n            //look for require calls, and pull them into the dependencies,\n            //but only if there are function args.\n            if (callback.length) {\n                callback\n                    .toString()\n                    .replace(commentRegExp, '')\n                    .replace(cjsRequireRegExp, function (match, dep) {\n                        deps.push(dep);\n                    });\n\n                //May be a CommonJS thing even without require calls, but still\n                //could use exports, and module. Avoid doing exports and module\n                //work though if it just needs require.\n                //REQUIRES the function to expect the CommonJS variables in the\n                //order listed below.\n                deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);\n            }\n        }\n\n        //If in IE 6-8 and hit an anonymous define() call, do the interactive\n        //work.\n        if (useInteractive) {\n            node = currentlyAddingScript || getInteractiveScript();\n            if (node) {\n                if (!name) {\n                    name = node.getAttribute('data-requiremodule');\n                }\n                context = contexts[node.getAttribute('data-requirecontext')];\n            }\n        }\n\n        //Always save off evaluating the def call until the script onload handler.\n        //This allows multiple modules to be in a file without prematurely\n        //tracing dependencies, and allows for anonymous module support,\n        //where the module name is not known until the script onload event\n        //occurs. If no context, use the global queue, and get it processed\n        //in the onscript load callback.\n        (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n\n\n    /**\n     * Executes the text. Normally just uses eval, but can be modified\n     * to use a better, environment-specific call. Only used for transpiling\n     * loader plugins, not for plain JS modules.\n     * @param {String} text the text to execute/evaluate.\n     */\n    req.exec = function (text) {\n        /*jslint evil: true */\n        return eval(text);\n    };\n\n    //Set up with config info.\n    req(cfg);\n}(this));\n"
  },
  {
    "path": "demos/snap-ad/src/config.rb",
    "content": "# Require any additional compass plugins here.\n\n# Set this to the root of your project when deployed:\nhttp_path = \"/\"\ncss_dir = \"css\"\nsass_dir = \"sass\"\nimages_dir = \"assets/images\"\njavascripts_dir = \"js\"\n\n# You can select your preferred output style here (can be overridden via the command line):\n# output_style = :expanded or :nested or :compact or :compressed\n\n# To enable relative paths to assets via compass helper functions. Uncomment:\n# relative_assets = true\n\n# To disable debugging comments that display the original location of your selectors. Uncomment:\n# line_comments = false\n\n\n# If you prefer the indented syntax, you might want to regenerate this\n# project again passing --syntax sass, or you can uncomment this:\n# preferred_syntax = :sass\n# and then run:\n# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass\n"
  },
  {
    "path": "demos/snap-ad/src/css/screen.css",
    "content": "/* line 3, ../sass/screen.scss */\n.base-font {\n  font-family: 'Open Sans', serif;\n}\n\n/* line 7, ../sass/screen.scss */\n.snap-font {\n  font-family: 'Source Sans Pro', serif;\n}\n\n/* line 11, ../sass/screen.scss */\nbody {\n  margin: 0;\n  cursor: pointer;\n}\n\n/* line 16, ../sass/screen.scss */\ntext {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n/* line 25, ../sass/screen.scss */\nsvg {\n  -webkit-transform-origin: top left;\n  -moz-transform-origin: top left;\n  -ms-transform-origin: top left;\n  -o-transform-origin: top left;\n  transform-origin: top left;\n  -webkit-transform: scale(1);\n  -moz-transform: scale(1);\n  -ms-transform: scale(1);\n  -o-transform: scale(1);\n  transform: scale(1);\n}\n\n/* line 30, ../sass/screen.scss */\n#learn-btn {\n  cursor: pointer;\n}\n/* line 33, ../sass/screen.scss */\n#learn-btn path, #learn-btn text {\n  -webkit-transform: translateY(0);\n  -moz-transform: translateY(0);\n  -ms-transform: translateY(0);\n  -o-transform: translateY(0);\n  transform: translateY(0);\n}\n/* line 39, ../sass/screen.scss */\n#learn-btn:hover path:first-child {\n  fill: #076656;\n}\n/* line 46, ../sass/screen.scss */\n#learn-btn:hover path:nth-child(2) {\n  fill: #7cd1c2;\n}\n/* line 51, ../sass/screen.scss */\n#learn-btn:hover text {\n  fill: #0a9a87;\n}\n/* line 59, ../sass/screen.scss */\n#learn-btn:active path:nth-child(2) {\n  -webkit-transform: translateY(2px);\n  -moz-transform: translateY(2px);\n  -ms-transform: translateY(2px);\n  -o-transform: translateY(2px);\n  transform: translateY(2px);\n}\n/* line 64, ../sass/screen.scss */\n#learn-btn:active text {\n  -webkit-transform: translateY(2px);\n  -moz-transform: translateY(2px);\n  -ms-transform: translateY(2px);\n  -o-transform: translateY(2px);\n  transform: translateY(2px);\n}\n\n/* line 71, ../sass/screen.scss */\n#replay-btn:hover {\n  opacity: 0.5;\n}\n\n/*\n@media (max-width: 400px) {\n\tsvg{\n\t\t@include transform(scale(0.375));\n\t}\n}\n*/\n"
  },
  {
    "path": "demos/snap-ad/src/index.html",
    "content": "<!DOCTYPE html>\n<!--[if lt IE 7]>      <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js lt-ie9 lt-ie8\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js lt-ie9\"> <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n\t\t<title>Snap! SVG</title>\n\t\t<link href=\"css/screen.css?__inline=true\" media=\"screen, projection\" rel=\"stylesheet\" type=\"text/css\" />\n\t\t<!--[if IE]>\n\t        <link href=\"/stylesheets/ie.css\" media=\"screen, projection\" rel=\"stylesheet\" type=\"text/css\" />\n\t    <![endif]-->\n\t</head>\n\t<body>\n\t\t<svg id=\"ad\" width=\"400\" height=\"400\">\n\t\t\t<g id=\"meshAContainer\">\n\t\t\t\t<rect x=\"0\" y=\"0\" width=\"400\" height=\"400\" fill=\"#efefef\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"screen1\">\n\t\t\t\t<text id=\"text1\" x=\"200\" y=\"130\" width=\"400\" \n\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfont-size=\"40\" \n\t\t\t\t\tfill=\"#686868\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\tScreens\n\t\t\t\t</text>\n\t\t\t\n\t\t\t\t<text id=\"text2\" x=\"200\" y=\"300\" width=\"400\" \n\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfont-size=\"40\" \n\t\t\t\t\tfill=\"#686868\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\tSVG\n\t\t\t\t</text>\n\t\t\t</g>\n\t\t\t\n\t\t\t<text id=\"text3\"\n\t\t\t\tclass=\"base-font\"\n\t\t\t\tfont-weight=\"100\" \n\t\t\t\tfont-size=\"50\" \n\t\t\t\tfill=\"white\"\n\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\topacity=\"0\">\n\t\t\t\t<tspan x=\"200\" y=\"180\">Make SVG</tspan>\n\t\t\t\t<tspan x=\"200\" y=\"250\">a Snap!</tspan>\n\t\t\t</text>\n\t\t\t\n\t\t\t<g id=\"heart\" transform=\"translate(200, 200)\">\n\t\t\t\t<path id=\"heart-shape\" fill=\"#0DAE8A\" d=\"M14.803-28.95c-5.879,0-11.119,2.418-14.547,6.192c-3.428-3.774-8.668-6.192-14.547-6.192c-10.329,0-23.453,4.75-23.453,23.75s38,35.414,38,35.414s38-16.414,38-35.414S25.133-28.95,14.803-28.95\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"burst\" transform=\"translate(200, 200)\" opacity=\"0\">\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 149.256,-214.94 227.256,-214.94 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 49.256,-214.94 77.256,-214.94 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -78.328,-214.94 -50.744,-212.273 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -113.661,209.06 -86.077,211.727 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,-214.94 -213.41,-135.607 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,-39 -213.41,10.334 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 -239.41,101 -213.41,130.334 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 215.697,21.383 241.697,50.717 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 215.697,-88.617 241.697,-59.283 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 208.691,137.42 207.805,194.354 \t\"/>\n\t\t\t\t<polygon fill=\"#FFFFFF\" points=\"0.451,0.063 95.256,211.727 61.923,240.194 \t\"/>\n\t\t\t</g>\n\t\t\t\n\t\t\t<g id=\"resolve\" opacity=\"0\">\n\t\t\t\t\n\t\t\t\t<g id=\"replay-btn\" transform=\"translate(345, 10)\">\n\t\t\t\t\t<rect fill=\"transparent\" width=\"48\" height=\"49.5\"/>\n\t\t\t\t\t<path fill=\"#cccccc\" d=\"M25.207,9.594V4.082L12.793,11.25l12.415,7.168v-5.792C31.57,13.466,36.5,18.912,36.5,25.5\n\t\t\t\t\t\tc0,7.168-5.832,13-13,13s-13-5.832-13-13c0-0.565,0.049-1.118,0.119-1.664l-2.922-0.717C7.58,23.898,7.5,24.689,7.5,25.5\n\t\t\t\t\t\tc0,8.822,7.178,16,16,16s16-7.178,16-16C39.5,17.255,33.229,10.449,25.207,9.594z\"/>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<text id=\"text4\"\n\t\t\t\t\tfont-weight=\"100\" \n\t\t\t\t\tfill=\"#02225d\"\n\t\t\t\t\ttext-anchor=\"middle\">\n\t\t\t\t\t<tspan x=\"200\" y=\"100\" \n\t\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\t\tfont-size=\"46\">\n\t\t\t\t\t\twith\n\t\t\t\t\t</tspan>\n\t\t\t\t\t<tspan x=\"200\" y=\"160\" \n\t\t\t\t\t\tclass=\"snap-font\"\n\t\t\t\t\t\tfont-size=\"70\">\n\t\t\t\t\t\tSnap.svg\n\t\t\t\t\t</tspan>\n\t\t\t\t</text>\n\t\t\t\t\n\t\t\t\t<g id=\"learn-btn\" transform=\"translate(10, 350)\">\n\t\t\t\t\t<path fill=\"#0B9B87\" d=\"M147.129,37.886c0,3.156-2.558,5.714-5.714,5.714H5.714C2.558,43.6,0,41.042,0,37.886V8.175\n\t\t\t\t\t\tc0-3.156,2.558-5.714,5.714-5.714h135.702c3.156,0,5.714,2.558,5.714,5.714V37.886z\"/>\n\t\t\t\t\t<path fill=\"#10B29C\" d=\"M147.129,35.425c0,3.156-2.558,5.714-5.714,5.714H5.714C2.558,41.139,0,38.581,0,35.425V5.714\n\t\t\t\t\t\tC0,2.558,2.558,0,5.714,0h135.702c3.156,0,5.714,2.558,5.714,5.714V35.425z\"/>\n\t\t\t\t\t<text x=\"10\" y=\"30\"\n\t\t\t\t\t\tfill=\"#FFFFFF\" \n\t\t\t\t\t\tclass=\"base-font\"\n\t\t\t\t\t\tfont-size=\"22.6026\">\n\t\t\t\t\t\tLearn More\n\t\t\t\t\t</text>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<g id=\"snap-logo\" transform=\"translate(200, 260)\">\n\t\t\t\t\t<path id=\"snap-logo-bottom\" fill=\"#192350\" d=\"M39.197,39.001c0.061,0.246,0.121,0.492,0.182,0.738c-12.801,6.518-39.257,19.54-39.257,19.54\n\t\t\t\t\t\ts-31.604-14.952-38.953-18.708c6.5-3.264,13.001-6.529,19.502-9.792c6.328,3.094,12.655,6.187,18.985,9.281\n\t\t\t\t\t\tc6.617-3.305,13.03-6.509,19.442-9.712C25.797,33.232,32.497,36.116,39.197,39.001z\"/>\n\t\t\t\t\t<path id=\"snap-logo-right\" fill=\"#03A69A\" d=\"M39.331-54.922c-0.436-0.191-12.519,6.201-18.125,9.588c0,11.23,0,22.46,0,34.096\n\t\t\t\t\t\tC15.45-8.229-33.891,16.743-40.257,20.134c0.058,6.744,0.117,13.489,0.175,20.233c0.417,0.068,0.834,0.136,1.25,0.204\n\t\t\t\t\t\tc6.5-3.264,72.753-37.591,78.221-40.492C39.369-18.255,39.35-36.588,39.331-54.922z\"/>\n\t\t\t\t\t<path id=\"snap-logo-top\" fill=\"#1E2A5A\" d=\"M39.331-54.922c-5.606,3.387-12.519,6.201-18.126,9.588c-7.193-3.185-14.386-6.371-21.719-9.617\n\t\t\t\t\t\tc-7.287,3.21-14.6,6.432-21.914,9.654c-5.869-2.958-11.739-5.916-17.609-8.874c-0.039-0.239-0.078-0.478-0.117-0.717\n\t\t\t\t\t\tc12.766-6.485,25.531-12.969,38.297-19.454C11.437-68.06,26.037-61.204,39.331-54.922z\"/>\n\t\t\t\t\t<path id=\"snap-logo-left\" fill=\"#133F68\" d=\"M-22.676-11.256c0-3.489,0-6.949,0-10.408c0-7.878,0.198-15.755,0.346-23.633\n\t\t\t\t\t\tc-5.869-2.958-11.788-5.916-17.658-8.874c0.003,11.317-0.018,22.635-0.015,33.952c-0.034,6.737-0.081,13.474-0.114,20.21\n\t\t\t\t\t\tc5.781,2.841,52.704,26.952,59.219,30.356c6.7,2.884,13.397,5.769,20.096,8.654c0.029-6.258,0.134-12.516,0.163-18.773\n\t\t\t\t\t\tC33.044,16.882-15.406-7.438-22.676-11.256z\"/>\n\t\t\t\t</g>\n\t\t\t\t\n\t\t\t\t<g id=\"adobe-logo\" transform=\"translate(350, 340)\">\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"22.447,0 35.605,0 35.605,31.389 \t\"/>\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"13.172,0 0,0 0,31.389 \t\"/>\n\t\t\t\t\t<polygon fill=\"#787878\" points=\"17.809,11.565 26.195,31.387 20.698,31.387 18.189,25.074 12.049,25.074 \t\"/>\n\t\t\t\t\t<g>\n\t\t\t\t\t\t<path fill=\"#787878\" d=\"M38.294,0c0.843,0,1.515,0.678,1.515,1.524c0,0.859-0.672,1.538-1.521,1.538S36.75,2.383,36.75,1.524\n\t\t\t\t\t\t\tC36.75,0.677,37.438,0,38.288,0H38.294z M38.287,0.259c-0.675,0-1.217,0.567-1.217,1.27c0,0.707,0.542,1.271,1.224,1.271\n\t\t\t\t\t\t\tc0.672,0.007,1.212-0.566,1.212-1.271c0-0.702-0.54-1.27-1.212-1.27H38.287z M38.01,2.414H37.7V0.716\n\t\t\t\t\t\t\tc0.144-0.025,0.285-0.049,0.512-0.049c0.271,0,0.442,0.053,0.556,0.141c0.094,0.068,0.146,0.188,0.146,0.346\n\t\t\t\t\t\t\tc0,0.22-0.142,0.363-0.33,0.411v0.017c0.149,0.026,0.245,0.161,0.277,0.414c0.042,0.265,0.077,0.367,0.105,0.419h-0.311\n\t\t\t\t\t\t\tc-0.039-0.052-0.075-0.207-0.112-0.435c-0.035-0.201-0.146-0.286-0.356-0.286h-0.179v0.721L38.01,2.414L38.01,2.414z M38.01,1.458\n\t\t\t\t\t\t\th0.185c0.221,0,0.406-0.074,0.406-0.271c0-0.15-0.107-0.285-0.392-0.285c-0.093,0-0.152,0-0.197,0.005v0.552L38.01,1.458\n\t\t\t\t\t\t\tL38.01,1.458z\"/>\n\t\t\t\t\t</g>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M4.782,44.511L4.366,42.05c-0.123-0.715-0.271-1.823-0.382-2.59H3.941c-0.124,0.771-0.294,1.914-0.42,2.596\n\t\t\t\t\t\tl-0.449,2.456L4.782,44.511L4.782,44.511z M2.847,46.12l-0.541,2.732h-2.01l2.501-11.373h2.457l2.271,11.373H5.507l-0.53-2.732\n\t\t\t\t\t\tH2.847z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M12.086,43.77c0-0.147,0-0.329-0.03-0.492c-0.078-0.561-0.381-1.067-0.863-1.067\n\t\t\t\t\t\tc-0.818,0-1.125,1.188-1.125,2.575c0,1.599,0.437,2.51,1.096,2.51c0.309,0,0.662-0.157,0.854-0.826\n\t\t\t\t\t\tc0.045-0.131,0.069-0.314,0.069-0.523L12.086,43.77L12.086,43.77z M14.148,37.174v9.318c0,0.743,0.037,1.647,0.067,2.359h-1.779\n\t\t\t\t\t\tl-0.119-0.947h-0.041c-0.298,0.583-0.948,1.086-1.721,1.086c-1.702,0-2.547-1.874-2.547-4.238c0-2.877,1.263-4.275,2.629-4.275\n\t\t\t\t\t\tc0.711,0,1.182,0.346,1.415,0.852h0.034v-4.152h2.062C14.148,37.177,14.148,37.174,14.148,37.174z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M18.428,47.415c0.782,0,0.982-1.474,0.982-2.697c0-1.159-0.2-2.67-1.018-2.67\n\t\t\t\t\t\tc-0.869,0-1.054,1.511-1.054,2.67c0,1.402,0.232,2.697,1.071,2.697H18.428z M18.387,48.989c-1.889,0-3.081-1.522-3.081-4.238\n\t\t\t\t\t\tc0-2.963,1.529-4.275,3.127-4.275c1.877,0,3.05,1.592,3.05,4.232c0,3.393-1.838,4.281-3.076,4.281H18.387z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M24.692,45.907c0,0.204,0.035,0.399,0.078,0.525c0.206,0.693,0.561,0.863,0.837,0.863\n\t\t\t\t\t\tc0.795,0,1.12-1.004,1.12-2.612c0-1.462-0.343-2.472-1.129-2.472c-0.392,0-0.72,0.423-0.832,0.877\n\t\t\t\t\t\tc-0.039,0.142-0.074,0.363-0.074,0.521C24.692,43.609,24.692,45.907,24.692,45.907z M22.634,37.174h2.058v4.293h0.032\n\t\t\t\t\t\tc0.406-0.634,0.945-0.994,1.731-0.994c1.55,0,2.331,1.758,2.331,4.049c0,2.91-1.168,4.467-2.67,4.467\n\t\t\t\t\t\tc-0.723,0-1.199-0.32-1.631-1.123h-0.042l-0.112,0.986h-1.765c0.03-0.688,0.069-1.616,0.069-2.359v-9.318L22.634,37.174\n\t\t\t\t\t\tL22.634,37.174z\"/>\n\t\t\t\t\t<path fill=\"#787878\" d=\"M33.712,43.945c0.007-1.161-0.328-1.976-0.982-1.976c-0.749,0-1.064,1.094-1.088,1.976H33.712z\n\t\t\t\t\t\t M31.635,45.393c0.024,1.49,0.811,1.978,1.788,1.978c0.623,0,1.153-0.135,1.545-0.287l0.282,1.474\n\t\t\t\t\t\tc-0.548,0.238-1.393,0.383-2.201,0.383c-2.211,0-3.411-1.498-3.411-4.067c0-2.759,1.394-4.408,3.221-4.408\n\t\t\t\t\t\tc1.769,0,2.748,1.458,2.748,3.85c0,0.545-0.026,0.85-0.063,1.093L31.635,45.393z\"/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t\t\n\t\t\t<rect id=\"cover\" width=\"400\" height=\"400\" fill=\"#efefef\"/>\n\t\t</svg>\n\t\t<script>\n\t\t  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n\t\t  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n\t\t  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n\t\t  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n\t\t  ga('create', 'UA-47561728-1', 'codepen.io');\n\t\t  ga('send', 'pageview');\n\n\t\t</script>\n\t\t\n\t\t<!-- build:js js/vendor/require.min.js?__inline=true -->\n\t\t<!-- /build -->\n\t\t<!-- build:js js/main.js?__inline=true -->\n\t\t<script data-main=\"js/main\" src=\"./js/vendor/require.js\"></script>\t\n\t\t<!-- /build -->\t\n\t\t<script src=\"http://ajax.googleapis.com/ajax/libs/webfont/1.4.7/webfont.js\"></script>\n\n\t\t<script>\n\t\t\tWebFont.load(WebFontConfig);\n\t\t</script>\n\t\t\n\t</body>\n</html>\n"
  },
  {
    "path": "demos/snap-ad/src/js/app/app.js",
    "content": "define(function (require) {\n\n\trequire('snap');\n\t\n\tvar App,\n\t\tHeart = require('app/heart'),\n\t\tDevice = require('app/device'),\n\t\tBurst = require('app/burst');\n\t\tMesh = require('app/mesh');\n\t\tLogo = require('app/logo');\n\n\tApp = function () {\n\t\tvar instance = this;\n\t\t\n\t\tthis.started = false;\n\t\t\t\t\n\t\tthis.init = function () {\n\t\t\tvar timeline,\n\t\t\t\tad,\n\t\t\t\ts,\n\t\t\t\tcover,\n\t\t\t\tdevice,\n\t\t\t\theart,\n\t\t\t\tburst,\n\t\t\t\tscreen1,\n\t\t\t\ttext1,\n\t\t\t\ttext2,\n\t\t\t\ttext3,\n\t\t\t\ttext4,\n\t\t\t\tresolveScreen,\n\t\t\t\tlogo,\n\t\t\t\tmeshA,\n\t\t\t\tmeshAContainer,\n\t\t\t\treplaycount = 0,\n\t\t\t\tWIDTH = 400,\n\t\t\t\tHEIGHT = 400,\n\t\t\t\tWHITE = \"#ffffff\",\n\t\t\t\tGREEN = \"#09ae8a\";\n\t\t\t\n\t\t\tthis.started = true;\n\t\t\t\n\t\t\tad = document.getElementById('ad');\n\t\t\ts = new Snap(\"#ad\");\n\t\t\tcover = s.select('#cover');\n\t\t\tmeshAContainer = s.select('#meshAContainer');\n\t\t\tscreen1 = s.select('#screen1');\n\t\t\ttext1 = s.select('#text1');\n\t\t\ttext2 = s.select('#text2');\n\t\t\ttext3 = s.select('#text3');\n\t\t\ttext4 = s.select('#text4');\n\t\t\treplayBtn = s.select('#replay-btn');\n\t\t\tresolveScreen = s.select('#resolve');\n\t\t\tlogo = new Logo(s);\n\t\t\t\n\t\t\thandle_RESIZE();\n\t\t\twindow.addEventListener('resize', handle_RESIZE);\n\t\t\tad.addEventListener('click', handle_CLICK);\t\t\t\n\t\t\treplayBtn.click(replay_CLICK);\n\t\t\t\n\t\t\taddMeshA();\t\n\t\t\tcover.remove();\n\t\t\taddHeart();\n\t\t\taddComputer();\n\t\t\taddBurst();\n\t\t\t\n\t\t\tfunction addHeart() {\n\t\t\t\theart = new Heart(s, WIDTH / 2, HEIGHT / 2);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addComputer() {\n\t\t\t\tdevice = new Device(s, WIDTH / 2, HEIGHT / 2);\n\t\t\t\tdevice.setScreen(192, 112);\n\t\t\t\tdevice.setBack(208, 148);\n\t\t\t\tdevice.setScale(0.1);\n\t\t\t\ttext2.after(device.el);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addBurst() {\n\t\t\t\tburst = new Burst(s);\n\t\t\t}\n\t\t\t\n\t\t\tfunction addMeshA() {\n\t\t\t\tmeshA = new Mesh(s, meshAContainer, '#afafaf', '#afafaf');\n\t\t\t}\n\t\t\t\n\t\t\tfunction addMeshB() {\n\t\t\t\tmeshA.el.remove();\n\t\t\t\tmeshB = new Mesh(s, meshBContainer, '#09ae8a', '#777777');\n\t\t\t}\n\t\t\t\n\t\t\tfunction showMeshB() {\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshB.start();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfunction showComputer() {\n\t\t\t\ttext1.animate({y: 80}, 100);\n\t\t\t\ttext2.animate({y: 350}, 100);\n\t\t\t\tdevice.animScale(10, 300, mina.bounce);\n\t\t\t\theart.animFill(WHITE);\n\t\t\t}\n\t\t\t\n\t\t\tfunction toTablet() {\n\t\t\t\tdevice.animRotation(-90);\t\n\t\t\t\tdevice.animScreen(76, 100);\n\t\t\t\tdevice.animBack(92, 132);\n\t\t\t\theart.animScale(0.5, 200);\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction toPhone() {\n\t\t\t\tdevice.hideKeyboard();\n\t\t\t\tdevice.animScreen(48, 76);\n\t\t\t\tdevice.animBack(56, 100);\n\t\t\t\theart.animScale(0.3);\n\t\t\t}\n\t\t\t\n\t\t\tfunction rotate() {\n\t\t\t\tdevice.animRotation(90);\n\t\t\t\theart.animScale(0.4);\n\t\t\t}\n\t\t\t\n\t\t\tfunction zoom() {\n\t\t\t\tmeshA.stop();\n\t\t\t\tdevice.animScale(10, 600);\n\t\t\t\theart.animScale(4, 600);\n\t\t\t\tburst.anim();\n\t\t\t}\n\t\t\t\n\t\t\tfunction greenMesh() {\n\t\t\t\t\n\t\t\t\tmeshA.setColor('#09ae8a', '#777777');\n\t\t\t\t\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.start();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdevice.animOpacity(0, 200);\n\t\t\t\tscreen1.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t\t\n\t\t\tfunction maskReveal() {\n\t\t\t\theart.mask();\n\t\t\t}\n\t\t\t\n\t\t\tfunction showText3() {\n\t\t\t\tdevice.setScale(0.01);\n\t\t\t\ttext3.animate({\n\t\t\t\t\topacity: 1\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t\t\n\t\t\tfunction hideText3() {\n\t\t\t\ttext3.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 200);\n\t\t\t\t\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.rippleColor('#afafaf', '#afafaf');\n\t\t\t\t} else {\n\t\t\t\t\tmeshA.setColor('#afafaf', '#afafaf');\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfunction resolve() {\n\t\t\t\tresolveScreen.animate({\n\t\t\t\t\topacity: 1\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t\t\n\t\t\tfunction stop() {\n\t\t\t\tlogo.animate();\n\t\t\t\tmeshA.stop();\n\t\t\t}\n\t\t\t\n\t\t\tfunction reset() {\n\t\t\t\tresolveScreen.attr({\n\t\t\t\t\topacity: 0\n\t\t\t\t});\t\t\n\t\t\t\t\n\t\t\t\tscreen1.attr({\n\t\t\t\t\topacity: 1\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\ttext1.attr({y: 130});\n\t\t\t\ttext2.attr({y: 300});\n\t\t\t\t\n\t\t\t\theart.setScale(1);\n\t\t\t\theart.setFill('#0DAE8A');\n\t\t\t\theart.unmask();\n\t\t\t\tdevice.setOpacity(1);\n\t\t\t\tdevice.setScreen(192, 112);\n\t\t\t\tdevice.setBack(208, 148);\n\t\t\t\tdevice.showKeyboard();\n\t\t\t\tmeshA.start();\n\t\t\t\tburst.reset();\n\t\t\t}\n\t\t\t\n\t\t\tfunction replay_CLICK(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t\t\n\t\t\t\treplaycount += 1;\n\t\t\t\tga('send', 'event', 'button', 'click', 'replay', replaycount);\n\t\t\t\treset();\n\t\t\t\trun();\n\t\t\t}\n\t\t\t\n\t\t\tfunction handle_CLICK(e) {\n\t\t\t\tga('send', 'event', 'button', 'click', 'ad');\n\t\t\t\ttop.window.location.href = 'http://snapsvg.io/';\n\t\t\t}\n\t\t\t\n\t\t\tfunction handle_RESIZE() {\n\t\t\t\tvar _w = window.innerWidth,\n\t\t\t\t\tscale = _w / 400;\n\t\t\t\t\n\t\t\t\tad.style.webkitTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.MozTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.msTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.oTransform = 'scale(' + scale + ')';\n\t\t\t\tad.style.transform = 'scale(' + scale + ')';\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tfunction run() {\n\t\t\t\tif (mobilecheck() !== true) {\n\t\t\t\t\tmeshA.start();\n\t\t\t\t}\n\t\t\t\tsetTimeout(showComputer, 2000);\n\t\t\t\tsetTimeout(toPhone, 3000);\n\t\t\t\tsetTimeout(rotate, 4000);\n\t\t\t\tsetTimeout(toTablet, 5000);\n\t\t\t\tsetTimeout(zoom, 6000);\n\t\t\t\tsetTimeout(greenMesh, 6300);\n\t\t\t\tsetTimeout(maskReveal, 6700);\n\t\t\t\tsetTimeout(showText3, 7000);\n\t\t\t\tsetTimeout(hideText3, 10000);\n\t\t\t\tsetTimeout(resolve, 10500);\n\t\t\t\tsetTimeout(stop, 10900);\n\t\t\t}\n\t\t\t\n\t\t\tfunction basic() {\n\t\t\t\tscreen1.attr({opacity: 0});\n\t\t\t\theart.el.attr({opacity: 0});\n\t\t\t\treplayBtn.attr({opacity: 0});\n\t\t\t\tlogo.show();\n\t\t\t\ttext4.select('tspan').attr({opacity: 0});\n\t\t\t\ttext4.select('tspan:nth-child(2)').attr({y: 120});\n\t\t\t\tresolveScreen.attr({opacity: 1});\n\t\t\t}\n\t\t\t\n\t\t\tif (window.replay !== true) {\n\t\t\t\treplayBtn.attr({opacity: 0});\n\t\t\t}\n\t\t\t\n\t\t\tif (window.supported !== false) {\n\t\t\t\trun();\n\t\t\t} else {\n\t\t\t\tbasic();\n\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t}\n\n\treturn App;\n});"
  },
  {
    "path": "demos/snap-ad/src/js/app/burst.js",
    "content": "define(function (require) {\n\t\n\tvar Burst = function (s, x, y) {\n\t\tvar instance = this,\n\t\t\tpolygons,\n\t\t\tmask,\n\t\t\tmaskCircle,\n\t\t\tmaskBg;\n\t\t\n\t\tthis.el = s.select(\"#burst\");\n\t\t\n\t\tmask = s.g();\n\t\tmask.toDefs();\n\t\t\n\t\tmaskBg = s.rect(-200, -200, 400, 400);\n\t\tmaskBg.attr({\n\t\t\tfill: 'white'\n\t\t});\n\t\tmask.append(maskBg);\n\t\t\n\t\tmaskCircle = s.circle(0, 0, 30);\n\t\tmask.append(maskCircle);\n\t\t\n\t\tthis.el.attr({\n\t\t\tmask: mask\n\t\t});\n\t\t\n\t\tthis.anim = function () {\n\t\t\tthis.el.animate({\n\t\t\t\topacity: 1\n\t\t\t}, 100);\n\t\t\t\n\t\t\tmaskCircle.animate({\n\t\t\t\ttransform: 'scale(6)'\n\t\t\t}, 300);\n\t\t\t\n\t\t\tsetTimeout(function () {\n\t\t\t\tinstance.el.animate({\n\t\t\t\t\topacity: 0\n\t\t\t\t}, 100);\n\t\t\t}, 300)\n\t\t}\n\t\t\n\t\tthis.reset = function () {\n\t\t\tmaskCircle.attr({\n\t\t\t\ttransform: 'scale(1)'\n\t\t\t});\n\t\t}\n\t}\n\t\n\treturn Burst;\n});"
  },
  {
    "path": "demos/snap-ad/src/js/app/device.js",
    "content": "define(function (require) {\n\t\n\tvar Device = function (s, x, y) {\n\t\tvar instance = this;\n\t\t\n\t\tthis.el = s.g();\n\t\tthis.matrix = new Snap.Matrix();\n\t\tthis.matrix.translate(x, y);\n\t\tthis.el.transform(this.matrix.toTransformString());\n\t\t\n\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\tthis.keyboardMatrix.translate(0, 70);\n\t\t\n\t\tinstance.maskElement = s.polygon();\n\t\tinstance.maskElement.toDefs();\n\t\t\n\t\taddBack();\n\t\taddScreen();\n\t\t//addGloss();\n\t\taddKeyboard();\n\t\t\n\t\tfunction addBack() {\n\t\t\tinstance.back = s.rect(0, 0, 0, 0);\n\t\t\tinstance.back.attr({\n\t\t\t\tfill: '#696969'\n\t\t\t});\n\n\t\t\tinstance.el.append(instance.back);\t\n\t\t}\n\t\t\n\t\tfunction addScreen() {\n\t\t\tinstance.scr = s.rect(0, 0, 0, 0);\n\t\t\tinstance.scr.attr({\n\t\t\t\tfill: \"#09ae8a\"\n\t\t\t});\n\n\t\t\tinstance.el.append(instance.scr);\n\t\t}\n\t\t\n\t\tfunction addKeyboard() {\n\t\t\tvar p1,\n\t\t\t\tp2;\n\t\t\t\t\n\t\t\tinstance.keyboard = s.g();\n\t\t\tinstance.keyboard.transform(instance.keyboardMatrix.toTransformString());\n\t\t\t\n\t\t\tp1 = s.polygon('-103.324,0 -135.324,32 136.676,32 104.676,0 ');\n\t\t\tp1.attr({\n\t\t\t\tfill: '#818181'\n\t\t\t});\n\t\t\t\n\t\t\tp2 = s.polygon('127.774,40 -128.226,40 -136.226,32 135.774,32 ');\n\t\t\tp2.attr({\n\t\t\t\tfill: '#676767'\n\t\t\t});\n\t\t\t\n\t\t\tinstance.keyboard.append(p1);\n\t\t\tinstance.keyboard.append(p2);\n\t\t\tinstance.el.append(instance.keyboard);\n\t\t}\n\t\t\n\t\tfunction addGloss() {\n\t\t\tinstance.gl = s.rect(0, 0, 0, 0);\n\t\t\tinstance.gl.attr({\n\t\t\t\topacity: 0.2,\n\t\t\t\tfill: \"white\",\n\t\t\t\tclipPath: instance.maskElement\n\t\t\t});\n\t\t\t\n\t\t\tinstance.el.append(instance.gl);\n\t\t}\n\t\t\n\t\tthis.hideKeyboard = function () {\n\t\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\t\tinstance.keyboardMatrix.translate(0, 50);\n\t\t\tinstance.keyboardMatrix.scale(0.01, 0.01, 0, 0);\n\t\t\tinstance.keyboard.animate({\n\t\t\t\topacity: 0,\n\t\t\t\ttransform: instance.keyboardMatrix.toTransformString()\n\t\t\t}, 100);\n\t\t}\n\t\t\n\t\tthis.showKeyboard = function () {\n\t\t\tthis.keyboardMatrix = new Snap.Matrix();\n\t\t\tinstance.keyboardMatrix.translate(0, 70);\n\t\t\tinstance.keyboardMatrix.scale(1, 1, 0, 0);\n\t\t\tinstance.keyboard.attr({\n\t\t\t\topacity: 1,\n\t\t\t\ttransform: instance.keyboardMatrix.toTransformString()\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.setScreen = function(w, h) {\n\t\t\tthis.scr.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t}\n\t\t\n\t\tthis.setBack = function (w, h) {\n\t\t\tthis.back.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t\t\n\t\t\t/*\n\t\t\tthis.gl.attr({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t});\n\t\t\t\n\t\t\tvar pointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\tpoints: pointString\n\t\t\t});\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.setScale = function (scale) {\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.transform(this.matrix.toTransformString());\n\t\t}\n\t\t\n\t\tthis.animScreen = function(w, h) {\n\t\t\tthis.scr.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t}\n\t\t\n\t\tthis.animBack = function (w, h) {\n\t\t\tthis.back.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t\t\n\t\t\t/*\n\t\t\tthis.gl.animate({\n\t\t\t\tx: -w / 2,\n\t\t\t\ty: -h / 2,\n\t\t\t\twidth: w,\n\t\t\t\theight: h\n\t\t\t}, 100);\n\t\t\t\n\t\t\tvar pointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\tpoints: pointString\n\t\t\t});\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.animRotation = function (r) {\n\t\t\tinstance.matrix.rotate(r, 0, 0);\n\t\t\t\t\t\n\t\t\tinstance.el.animate({\n\t\t\t\ttransform: instance.matrix.toTransformString()\n\t\t\t}, 100, mina.easeIn);\n\t\t\t\n\t\t\t/*\n\t\t\tif (r == 90) {\n\t\t\t\tvar w = 100,\n\t\t\t\t\th = 56,\n\t\t\t\t\tpointString = -w / 2 + ' ' + -h / 2 + ',' + w / 2 + ' ' + -h / 2 + ',' + -w / 2 + ' ' + h / 2;\n\t\t\t\t\n\t\t\t\tinstance.maskElement.attr({\n\t\t\t\t\tpoints: pointString\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tinstance.maskElement.animate({\n\t\t\t\t\ttransform: 'rotate(-90)'\n\t\t\t\t}, 100, mina.easeIn);\n\t\t\t} else {\n\t\t\t\tinstance.maskElement.animate({\n\t\t\t\t\ttransform: 'rotate(0)'\n\t\t\t\t}, 100, mina.easeIn);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\t\t\n\t\tthis.animScale = function (scale, dur, ease) {\n\t\t\tdur = dur ? dur : 100;\n\t\t\tease = ease ? ease : mina.easeout;\n\t\t\t\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.animate({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t}, dur, ease);\n\t\t}\n\t\t\n\t\tthis.animOpacity = function (opacity, dur) {\n\t\t\tdur = dur ? dur : 200;\n\t\t\t\n\t\t\tthis.el.animate({\n\t\t\t\topacity: opacity\n\t\t\t}, dur);\n\t\t}\n\t\t\n\t\tthis.setOpacity = function (opacity) {\t\t\t\n\t\t\tthis.el.attr({\n\t\t\t\topacity: opacity\n\t\t\t});\n\t\t}\n\t}\n\t\n\treturn Device;\n});"
  },
  {
    "path": "demos/snap-ad/src/js/app/heart.js",
    "content": "define(function (require) {\n\t\n\tvar Heart = function (s, x, y) {\n\t\tvar instance = this,\n\t\t\theart,\n\t\t\theartMatrix,\n\t\t\ttotalMaskVertices = 50;\n\t\t\n\t\tthis.el = s.select(\"#heart\");\n\t\theart = this.el.select('#heart-shape');\n\t\t\n\t\tinstance.maskElement = s.path(getPath(totalMaskVertices));\t\t\n\t\tinstance.el.attr({\n\t\t\tclipPath: instance.maskElement\n\t\t});\n\t\t\n\t\tthis.animFill = function (f, dur) {\n\t\t\theart.animate({\n\t\t\t\tfill: f\n\t\t\t}, 200);\n\t\t}\n\t\t\n\t\tthis.setFill = function (f, dur) {\n\t\t\theart.attr({\n\t\t\t\tfill: f\n\t\t\t}, 200);\n\t\t}\n\t\t\n\t\tthis.animScale = function (scale, dur) {\n\t\t\tdur = dur ? dur : 300;\n\t\t\t\n\t\t\tthis.matrix = new Snap.Matrix();\n\t\t\tthis.matrix.translate(x, y);\n\t\t\tthis.matrix.scale(scale);\n\t\t\tthis.el.animate({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t}, dur, mina.bounce);\n\t\t}\n\t\t\n\t\tthis.setScale = function (scale, dur) {\n\t\t\tdur = dur ? dur : 300;\n\t\t\t\n\t\t\tthis.matrix = new Snap.Matrix();\n\t\t\tthis.matrix.translate(x, y);\n\t\t\tthis.matrix.scale(scale, scale, 0, 0);\n\t\t\tthis.el.attr({\n\t\t\t\ttransform: this.matrix.toTransformString()\n\t\t\t});\n\t\t\t\n\t\t}\n\t\t\n\t\tthis.mask = function () {\n\t\t\tvar n = totalMaskVertices;\n\t\t\t\n\t\t\tinstance.maskElement.attr({\n\t\t\t\td: getPath(n)\n\t\t\t});\n\t\t\t\n\t\t\tfunction updatePath() {\n\t\t\t\tn -= 1;\n\t\t\t\tinstance.maskElement.attr({\n\t\t\t\t\td: getPath(n)\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif (n > 0) {\n\t\t\t\t\tsetTimeout(updatePath, 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tsetTimeout(updatePath, 10);\n\t\t}\n\t\t\n\t\tthis.unmask = function () {\n\t\t\tinstance.maskElement.attr({\n\t\t\t\td: getPath(totalMaskVertices)\n\t\t\t});\n\t\t}\n\t\t\n\t\tfunction getPath(n) {\n\t\t\tvar pathString,\n\t\t\t\ti,\n\t\t\t\t_x,\n\t\t\t\t_y;\n\t\t\t\n\t\t\tpathString = \"M0 0\";\n\t\t\t\n\t\t\tfor (i = 0; i < n + 1; i += 1) {\n\t\t\t\ta = 2 * Math.PI * i / totalMaskVertices;\n                a += Math.PI;\n\n\t\t\t\t_x = Math.sin(a) * 50;\n\t\t\t\t_y = Math.cos(a) * 50;\n\t\t\t\t\n\t\t\t\tpathString += \"L\" + _x + \" \" + _y;\n\t\t\t}\n\t\t\t\n\t\t\tpathString += \"Z\";\n\t\t\treturn pathString;\n\t\t}\n\t}\n\t\n\treturn Heart;\n});"
  },
  {
    "path": "demos/snap-ad/src/js/app/logo.js",
    "content": "define(function (require) {\n\t\t\n\tvar Logo = function (s) {\n\t\tvar instance = this,\n\t\t\tlogo,\n\t\t\tparts = [\n\t\t\t\t['top', 0, 20], \n\t\t\t\t['left', 20, 0], \n\t\t\t\t['bottom', 0, -20],\n\t\t\t\t['right', -20, 0]\n\t\t\t],\n\t\t\tcomponents = [],\n\t\t\ti = 0,\n\t\t\tk = 0,\n\t\t\tisLogoAnimated = false,\n\t\t\tisCrocAnimated = false,\n\t\t\tisCroc2Animated = false;\n\t\t\n\t\tlogo = s.select(\"#snap-logo\");\n\n\t\tfor (i = 0; i < parts.length; i++) {\n\t\t\tvar el = parts[i]\n\t\t\telid = el[0];\n\t\t\telement = logo.select(\"#snap-logo-\" + elid);\n\t\t\telement.attr({opacity:0, transform: \"t\" + (el[1]) + \",\" + (el[2])});\n\t\t    components.push(element);\n\t\t}\n\n\t\tfunction animateEach() {\n\t\t\tif (!components[k]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t    components[k].animate({ \n\t\t        transform: \"t\" + (0) + \",\" + (0),\n\t\t        opacity: 1\n\t\t    }, 250, mina.easeout);\n\t\t\tsetTimeout(animateEach, 150);\n\t\t\tk++;\n\t\t};\n\t\t\n\t\tthis.animate = function () {\n\t\t\tsetTimeout(animateEach, 150);\n\t\t}\n\t\t\n\t\tthis.show = function () {\n\t\t\tvar i;\n\t\t\t\n\t\t\tfor (i = 0; i < components.length; i += 1) {\n\t\t\t\tcomponents[i].attr({ \n\t\t\t    \ttransform: \"t\" + (0) + \",\" + (0),\n\t\t\t    \topacity: 1\n\t\t\t    });\n\t\t\t}\n\t\t    \n\t\t}\n\t}\n\t\n\treturn Logo;\n});"
  },
  {
    "path": "demos/snap-ad/src/js/app/mesh.js",
    "content": "define(function (require) {\n\t\n\trequire('vendor/fss');\n\t\n\tvar Mesh = function (s, container, colorA, colorB) {\n\t\tvar instance = this,\n\t\t\t_width = 440,\n\t\t\t_height = 440,\n\t\t\tnow,\n\t\t\tstart = Date.now(),\n\t\t\trenderer,\n\t\t\tscene,\n\t\t\tgeometry,\n\t\t\tmaterial,\n\t\t\tmesh,\n\t\t\tlight;\n\t\t\n\t\tinstance.animating = false;\n\t\t\n\t\tinstance.init = function () {\n\t\t\trenderer = new FSS.SVGRenderer(s);\n\t\t\trenderer.setSize(_width, _height);\n\t\t\trenderer.element.transform('translate(-20, -20)'); //keep edges from showing\n\t\t\t\n\t\t\tinstance.el = renderer.element;\n\t\t\t\n\t\t\tcontainer.append(renderer.element);\n\n\t\t\tscene = new FSS.Scene();\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\t\t    geometry = new FSS.Plane(_width, _height, 10, 10, s, material);\n\t\t\tmesh = new FSS.Mesh(geometry, material);\n\t\t\tscene.add(mesh);\n\n\t\t\tlight = new FSS.Light('#eeeeee', '#eeeeee');\n\t\t\tlight.setPosition(300*Math.sin(0.001), 200*Math.cos(0.0005), 100);\n\t\t\tscene.add(light);\n\n\t\t\tnow = Date.now() - start;\n\n\t\t\ttweakMesh();\n\t\t\tdistortMesh();\t\t\t\n\t\t\trenderer.render(scene);\n\t\t}\n\t\t\n\t\tinstance.start = function () {\n\t\t\tinstance.animating = true;\n\t\t\tanimate();\n\t\t}\n\t\t\n\t\tinstance.stop = function () {\n\t\t\tinstance.animating = false;\n\t\t}\n\t\t\n\t\tinstance.setColor = function (colorA, colorB) {\n\t\t\tvar i;\n\t\t\t\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\t\t\t\n\t\t\tfor (i = geometry.triangles.length - 1; i > -1; i -= 1) {\t\n\t\t\t\tgeometry.triangles[i].material = material;\n\t\t\t}\n\t\t\t\n\t\t\tanimate();\n\t\t}\n\t\t\n\t\tinstance.rippleColor = function (colorA, colorB) {\n\t\t\tvar i;\n\t\t\t\n\t\t\tmaterial = new FSS.Material(colorA, colorB);\n\n\t\t\tfunction colorTriangle(j) {\n\t\t\t\tgeometry.triangles[j].material = material;\n\n\t\t\t\tif (j == 0) {\n\t\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t\tanimate();\n\t\t\t\t\t}, 10); //force clear\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (i = geometry.triangles.length - 1; i > -1; i -= 1) {\t\t\t\t\t\t\t\t\n\t\t\t\tvar speed = 200 + Math.sin(0.1 + Math.abs(geometry.triangles[i].centroid[0] / geometry.triangles[i].centroid[1])) * 100;\n\t\t\t\tsetTimeout(colorTriangle, speed * 2, i);\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\tfunction tweakMesh() {\n\t\t\tvar v, vertex;\n\t\t\t\n\t\t\tfor (v = geometry.vertices.length - 1; v >= 0; v--) {\n\t\t\t      vertex = geometry.vertices[v];\n\t\t\t      vertex.anchor = FSS.Vector3.clone(vertex.position);\n\t\t\t      vertex.step = FSS.Vector3.create(\n\t\t\t        Math.randomInRange(0.2, 1.0),\n\t\t\t        Math.randomInRange(0.2, 1.0),\n\t\t\t        Math.randomInRange(0.2, 1.0)\n\t\t\t      );\n\t\t\t\tvertex.time = Math.randomInRange(0, Math.PIM2);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction distortMesh() {\n\t\t\tvar v,\n\t\t\t\tvertex,\n\t\t\t\tox, oy, oz,\n\t\t\t\toffset = 10 / 2;\n\t\t\t\n\t\t\tfor (v = geometry.vertices.length - 1; v >= 0; v--) {\n\t\t      vertex = geometry.vertices[v];\n\t\t      ox = Math.sin(vertex.time + vertex.step[0] * now * 0.002);\n\t\t      oy = Math.cos(vertex.time + vertex.step[1] * now * 0.002);\n\t\t      oz = Math.sin(vertex.time + vertex.step[2] * now * 0.002);\n\t\t      FSS.Vector3.set(vertex.position,\n\t\t        0.2 * geometry.segmentWidth * ox,\n\t\t        0.1 * geometry.sliceHeight * oy,\n\t\t        0.7 * offset * oz - offset);\n\t\t      FSS.Vector3.add(vertex.position, vertex.anchor);\n\t\t    }\n\n\t\t    geometry.dirty = true;\n\t\t}\n\t\n\t\tfunction animate() {\n\t\t\tnow = Date.now() - start;\n\t\t\t\n\t\t\tif (mobilecheck() !== true) {\n\t\t\t\tdistortMesh();\n\t\t\t}\n\t\t\t\n\t\t\trenderer.render(scene);\n\t\t\t\n\t\t\tif (instance.animating !== false) {\n\t\t\t\trequestAnimationFrame(animate);\n\t\t\t}\n\t\t}\n\t\t\n\t\tinstance.init();\n\t}\n\t\n\treturn Mesh;\n});"
  },
  {
    "path": "demos/snap-ad/src/js/main.js",
    "content": "/*global require*/\n\nrequire.config({\n    shim: {\n\n    },\n    paths: {\n\t    snap: 'vendor/snap.svg',\n\t    tweenlite: 'vendor/greensock/TweenLite',\n\t    timelinelite: 'vendor/greensock/TimelineLite'\n    }\n});\n\n/**\n* check support\n*/\nwindow.ua = navigator.userAgent.toLowerCase();\nwindow.isAndroid = ua.indexOf(\"android\") > -1;\nwindow.isSafari = ua.indexOf(\"safari\") > -1 && ua.indexOf(\"chrome\") === -1;\n\nfunction checkSVG() {\n\treturn !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;\n}\n\n/**\n* check mobile\n*/\nwindow.mobilecheck = function() {\n\tvar check = false;\n\t(function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|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/i.test(a)||/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(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)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n\treturn check; \n}\n\nfunction addFallback() {\n\tvar link,\n\t\timg;\n\t\t\n\tlink = document.createElement('a');\n\tlink.href = \"http://snapsvg.io/\";\n\tdocument.body.appendChild(link);\n\t\n\timg = new Image();\n\timg.src = \"backup.jpg\";\n\timg.style.position = \"absolute\";\n\timg.style.top = \"0\";\n\timg.style.left = \"0\";\n\timg.width = \"100%\";\n\tlink.appendChild(img);\n}\n\nwindow.supported = true;\nwindow.replay = true;\n\nrequire(['app/app'], function (App) {\n\t\n\tif (checkSVG() !== true) {\n\t\taddFallback();\n\t\treturn;\n\t}\n\n\tif (isAndroid === true) {\n\t\twindow.supported = false;\n\t}\n\n\tif (isSafari === true) {\n\t\twindow.replay = false;\n\t}\n\t\n\twindow.app = new App();\n\t//app.init(); //fired from font loading\n});\n\n\n\n/**\n* font loading\n*/\nWebFontConfig = {\n\tgoogle: {\n\t\tfamilies: ['Open+Sans:300:latin', 'Source+Sans+Pro::latin']\n\t},\n\tinactive: function () {\n\t\tif (typeof(app) !== 'undefined' && app.started !== true) {\n\t\t\tapp.init();\n\t\t}\n\t},\n\tfontactive: function(familyName, fvd) {\n\t\tif (typeof(app) !== 'undefined' && familyName == 'Open Sans') {\n\t\t\tif (app.started !== true) {\n\t\t\t\tapp.init();\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Color.js",
    "content": "/**\n * @class Color\n * @author Matthew Wagerfield\n */\nFSS.Color = function(hex, opacity) {\n  this.rgba = FSS.Vector4.create();\n  this.hex = hex || '#000000';\n  this.opacity = FSS.Utils.isNumber(opacity) ? opacity : 1;\n  this.set(this.hex, this.opacity);\n};\n\nFSS.Color.prototype = {\n  set: function(hex, opacity) {\n    hex = hex.replace('#', '');\n    var size = hex.length / 3;\n    this.rgba[0] = parseInt(hex.substring(size*0, size*1), 16) / 255;\n    this.rgba[1] = parseInt(hex.substring(size*1, size*2), 16) / 255;\n    this.rgba[2] = parseInt(hex.substring(size*2, size*3), 16) / 255;\n    this.rgba[3] = FSS.Utils.isNumber(opacity) ? opacity : this.rgba[3];\n    return this;\n  },\n  hexify: function(channel) {\n    var hex = Math.ceil(channel*255).toString(16);\n    if (hex.length === 1) { hex = '0' + hex; }\n    return hex;\n  },\n  format: function() {\n    var r = this.hexify(this.rgba[0]);\n    var g = this.hexify(this.rgba[1]);\n    var b = this.hexify(this.rgba[2]);\n    this.hex = '#' + r + g + b;\n    return this.hex;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Core.js",
    "content": "/**\n * Defines the Flat Surface Shader namespace for all the awesomeness to exist upon.\n * @author Matthew Wagerfield\n */\nFSS = {\n  FRONT  : 0,\n  BACK   : 1,\n  DOUBLE : 2,\n  SVGNS  : 'http://www.w3.org/2000/svg'\n};\n\n/**\n * @class Array\n * @author Matthew Wagerfield\n */\nFSS.Array = typeof Float32Array === 'function' ? Float32Array : Array;\n\n/**\n * @class Utils\n * @author Matthew Wagerfield\n */\nFSS.Utils = {\n  isNumber: function(value) {\n    return !isNaN(parseFloat(value)) && isFinite(value);\n  }\n};\n\n/**\n * Request Animation Frame Polyfill.\n * @author Paul Irish\n * @see https://gist.github.com/paulirish/1579671\n */\n(function() {\n\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n    window.cancelAnimationFrame  = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = function(callback, element) {\n      var currentTime = new Date().getTime();\n      var timeToCall = Math.max(0, 16 - (currentTime - lastTime));\n      var id = window.setTimeout(function() {\n        callback(currentTime + timeToCall);\n      }, timeToCall);\n      lastTime = currentTime + timeToCall;\n      return id;\n    };\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = function(id) {\n      clearTimeout(id);\n    };\n  }\n\n}());\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Geometry.js",
    "content": "/**\n * @class Geometry\n * @author Matthew Wagerfield\n */\nFSS.Geometry = function() {\n  this.vertices = [];\n  this.triangles = [];\n  this.dirty = false;\n};\n\nFSS.Geometry.prototype = {\n  update: function() {\n    if (this.dirty) {\n      var t,triangle;\n      for (t = this.triangles.length - 1; t >= 0; t--) {\n        triangle = this.triangles[t];\n        triangle.computeCentroid();\n        triangle.computeNormal();\n      }\n      this.dirty = false;\n    }\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Light.js",
    "content": "/**\n * @class Light\n * @author Matthew Wagerfield\n */\nFSS.Light = function(ambient, diffuse) {\n  FSS.Object.call(this);\n  this.ambient = new FSS.Color(ambient || '#FFFFFF');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.ray = FSS.Vector3.create();\n};\n\nFSS.Light.prototype = Object.create(FSS.Object.prototype);\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Material.js",
    "content": "/**\n * @class Material\n * @author Matthew Wagerfield\n */\nFSS.Material = function(ambient, diffuse) {\n  this.ambient = new FSS.Color(ambient || '#444444');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.slave = new FSS.Color();\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Math.js",
    "content": "/**\n * @object Math Augmentation\n * @author Matthew Wagerfield\n */\nMath.PIM2 = Math.PI*2;\nMath.PID2 = Math.PI/2;\nMath.randomInRange = function(min, max) {\n  return min + (max - min) * Math.random();\n};\nMath.clamp = function(value, min, max) {\n  value = Math.max(value, min);\n  value = Math.min(value, max);\n  return value;\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Mesh.js",
    "content": "/**\n * @class Mesh\n * @author Matthew Wagerfield\n */\nFSS.Mesh = function(geometry, material) {\n  FSS.Object.call(this);\n  this.geometry = geometry || new FSS.Geometry();\n  this.material = material || new FSS.Material();\n  this.side = FSS.FRONT;\n  this.visible = true;\n};\n\nFSS.Mesh.prototype = Object.create(FSS.Object.prototype);\n\nFSS.Mesh.prototype.update = function(lights, calculate) {\n  var t,triangle, l,light, illuminance;\n\n  // Update Geometry\n  this.geometry.update();\n\n  // Calculate the triangle colors\n  if (calculate) {\n\n    // Iterate through Triangles\n    for (t = this.geometry.triangles.length - 1; t >= 0; t--) {\n      triangle = this.geometry.triangles[t];\n\n      // Reset Triangle Color\n      FSS.Vector4.set(triangle.color.rgba);\n\n      // Iterate through Lights\n      for (l = lights.length - 1; l >= 0; l--) {\n        light = lights[l];\n\n        // Calculate Illuminance\n        FSS.Vector3.subtractVectors(light.ray, light.position, triangle.centroid);\n        FSS.Vector3.normalise(light.ray);\n        illuminance = FSS.Vector3.dot(triangle.normal, light.ray);\n        if (this.side === FSS.FRONT) {\n          illuminance = Math.max(illuminance, 0);\n        } else if (this.side === FSS.BACK) {\n          illuminance = Math.abs(Math.min(illuminance, 0));\n        } else if (this.side === FSS.DOUBLE) {\n          illuminance = Math.max(Math.abs(illuminance), 0);\n        }\n\n        // Calculate Ambient Light\n        FSS.Vector4.multiplyVectors(this.material.slave.rgba, this.material.ambient.rgba, light.ambient.rgba);\n        FSS.Vector4.add(triangle.color.rgba, this.material.slave.rgba);\n\n        // Calculate Diffuse Light\n        FSS.Vector4.multiplyVectors(this.material.slave.rgba, this.material.diffuse.rgba, light.diffuse.rgba);\n        FSS.Vector4.multiplyScalar(this.material.slave.rgba, illuminance);\n        FSS.Vector4.add(triangle.color.rgba, this.material.slave.rgba);\n      }\n\n      // Clamp & Format Color\n      FSS.Vector4.clamp(triangle.color.rgba, 0, 1);\n    }\n  }\n  return this;\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Object.js",
    "content": "/**\n * @class Object\n * @author Matthew Wagerfield\n */\nFSS.Object = function() {\n  this.position = FSS.Vector3.create();\n};\n\nFSS.Object.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Plane.js",
    "content": "/**\n * @class Plane\n * @author Matthew Wagerfield\n */\nFSS.Plane = function(width, height, segments, slices, s) {\n  FSS.Geometry.call(this);\n  this.width = width || 100;\n  this.height = height || 100;\n  this.segments = segments || 4;\n  this.slices = slices || 4;\n  this.segmentWidth = this.width / this.segments;\n  this.sliceHeight = this.height / this.slices;\n\n  // Cache Variables\n  var x, y, v0, v1, v2, v3,\n      vertex, triangle, vertices = [],\n      offsetX = this.width * -0.5,\n      offsetY = this.height * 0.5;\n\n  // Add Vertices\n  for (x = 0; x <= this.segments; x++) {\n    vertices.push([]);\n    for (y = 0; y <= this.slices; y++) {\n      vertex = new FSS.Vertex(offsetX + x*this.segmentWidth, offsetY - y*this.sliceHeight);\n      vertices[x].push(vertex);\n      this.vertices.push(vertex);\n    }\n  }\n\n  // Add Triangles\n  for (x = 0; x < this.segments; x++) {\n    for (y = 0; y < this.slices; y++) {\n      v0 = vertices[x+0][y+0];\n      v1 = vertices[x+0][y+1];\n      v2 = vertices[x+1][y+0];\n      v3 = vertices[x+1][y+1];\n      t0 = new FSS.Triangle(v0, v1, v2, s);\n      t1 = new FSS.Triangle(v2, v1, v3, s);\n      this.triangles.push(t0, t1);\n    }\n  }\n};\n\nFSS.Plane.prototype = Object.create(FSS.Geometry.prototype);\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Renderer.js",
    "content": "/**\n * @class Renderer\n * @author Matthew Wagerfield\n */\nFSS.Renderer = function() {\n  this.width = 0;\n  this.height = 0;\n  this.halfWidth = 0;\n  this.halfHeight = 0;\n};\n\nFSS.Renderer.prototype = {\n  setSize: function(width, height) {\n    if (this.width === width && this.height === height) return;\n    this.width = width;\n    this.height = height;\n    this.halfWidth = this.width * 0.5;\n    this.halfHeight = this.height * 0.5;\n    return this;\n  },\n  clear: function() {\n    return this;\n  },\n  render: function(scene) {\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/SVGRenderer.js",
    "content": "/**\n * @class SVG Renderer\n * @author Matthew Wagerfield\n */\nFSS.SVGRenderer = function(s) {\n  FSS.Renderer.call(this);\n  this.element = s.g();\n};\n\nFSS.SVGRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.SVGRenderer.prototype.setSize = function(width, height) {\n  FSS.Renderer.prototype.setSize.call(this, width, height);\n  return this;\n};\n\nFSS.SVGRenderer.prototype.clear = function() {\n  FSS.Renderer.prototype.clear.call(this);\n  for (var i = this.element.childNodes.length - 1; i >= 0; i--) {\n    this.element.removeChild(this.element.childNodes[i]);\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.render = function(scene) {\n  FSS.Renderer.prototype.render.call(this, scene);\n  var m,mesh, t,triangle, points, style;\n\n  // Update Meshes\n  for (m = scene.meshes.length - 1; m >= 0; m--) {\n    mesh = scene.meshes[m];\n    if (mesh.visible) {\n      mesh.update(scene.lights, true);\n\n      // Render Triangles\n      for (t = mesh.geometry.triangles.length - 1; t >= 0; t--) {\n        triangle = mesh.geometry.triangles[t];\n\n\t\tif (triangle.polygon.parent() !== this.element) {\n\t\t\tthis.element.append(triangle.polygon);\n\t\t}\n\t\t\n        points  = this.formatPoint(triangle.a)+' ';\n        points += this.formatPoint(triangle.b)+' ';\n        points += this.formatPoint(triangle.c);\n        style = this.formatStyle(triangle.color.format());\n\t\t\n\t\ttriangle.polygon.attr({\n\t\t\tpoints: points,\n\t\t\tstyle: style\n\t\t});\n      }\n    }\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.formatPoint = function(vertex) {\n  return (this.halfWidth+vertex.position[0])+','+(this.halfHeight-vertex.position[1]);\n};\n\nFSS.SVGRenderer.prototype.formatStyle = function(color) {\n  var style = 'fill:'+color+';';\n  style += 'stroke:'+color+';';\n  return style;\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Scene.js",
    "content": "/**\n * @class Scene\n * @author Matthew Wagerfield\n */\nFSS.Scene = function() {\n  this.meshes = [];\n  this.lights = [];\n};\n\nFSS.Scene.prototype = {\n  add: function(object) {\n    if (object instanceof FSS.Mesh && !~this.meshes.indexOf(object)) {\n      this.meshes.push(object);\n    } else if (object instanceof FSS.Light && !~this.lights.indexOf(object)) {\n      this.lights.push(object);\n    }\n    return this;\n  },\n  remove: function(object) {\n    if (object instanceof FSS.Mesh && ~this.meshes.indexOf(object)) {\n      this.meshes.splice(this.meshes.indexOf(object), 1);\n    } else if (object instanceof FSS.Light && ~this.lights.indexOf(object)) {\n      this.lights.splice(this.lights.indexOf(object), 1);\n    }\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Triangle.js",
    "content": "/**\n * @class Triangle\n * @author Matthew Wagerfield\n */\nFSS.Triangle = function(a, b, c, s) {\n  this.a = a || new FSS.Vertex();\n  this.b = b || new FSS.Vertex();\n  this.c = c || new FSS.Vertex();\n  this.vertices = [this.a, this.b, this.c];\n  this.u = FSS.Vector3.create();\n  this.v = FSS.Vector3.create();\n  this.centroid = FSS.Vector3.create();\n  this.normal = FSS.Vector3.create();\n  this.color = new FSS.Color();\n  this.polygon = s.polygon();\n  this.polygon.attr({\n    'stroke-linejoin': 'round',\n\t'stroke-miterlimit': 1,\n\t'stroke-width': 1\n  });\n\n  this.computeCentroid();\n  this.computeNormal();\n};\n\nFSS.Triangle.prototype = {\n  computeCentroid: function() {\n    this.centroid[0] = this.a.position[0] + this.b.position[0] + this.c.position[0];\n    this.centroid[1] = this.a.position[1] + this.b.position[1] + this.c.position[1];\n    this.centroid[2] = this.a.position[2] + this.b.position[2] + this.c.position[2];\n    FSS.Vector3.divideScalar(this.centroid, 3);\n    return this;\n  },\n  computeNormal: function() {\n    FSS.Vector3.subtractVectors(this.u, this.b.position, this.a.position);\n    FSS.Vector3.subtractVectors(this.v, this.c.position, this.a.position);\n    FSS.Vector3.crossVectors(this.normal, this.u, this.v);\n    FSS.Vector3.normalise(this.normal);\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Vector3.js",
    "content": "/**\n * @object Vector3\n * @author Matthew Wagerfield\n */\nFSS.Vector3 = {\n  create: function(x, y, z) {\n    var vector = new FSS.Array(3);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  clone: function(a) {\n    var vector = this.create();\n    this.copy(vector, a);\n    return vector;\n  },\n  set: function(target, x, y, z) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  copy: function(target, a) {\n    target[0] = a[0];\n    target[1] = a[1];\n    target[2] = a[2];\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    return this;\n  },\n  addVectors: function(target, a, b) {\n    target[0] = a[0] + b[0];\n    target[1] = a[1] + b[1];\n    target[2] = a[2] + b[2];\n    return this;\n  },\n  addScalar: function(target, s) {\n    target[0] += s;\n    target[1] += s;\n    target[2] += s;\n    return this;\n  },\n  subtract: function(target, a) {\n    target[0] -= a[0];\n    target[1] -= a[1];\n    target[2] -= a[2];\n    return this;\n  },\n  subtractVectors: function(target, a, b) {\n    target[0] = a[0] - b[0];\n    target[1] = a[1] - b[1];\n    target[2] = a[2] - b[2];\n    return this;\n  },\n  subtractScalar: function(target, s) {\n    target[0] -= s;\n    target[1] -= s;\n    target[2] -= s;\n    return this;\n  },\n  multiply: function(target, a) {\n    target[0] *= a[0];\n    target[1] *= a[1];\n    target[2] *= a[2];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    return this;\n  },\n  divide: function(target, a) {\n    target[0] /= a[0];\n    target[1] /= a[1];\n    target[2] /= a[2];\n    return this;\n  },\n  divideVectors: function(target, a, b) {\n    target[0] = a[0] / b[0];\n    target[1] = a[1] / b[1];\n    target[2] = a[2] / b[2];\n    return this;\n  },\n  divideScalar: function(target, s) {\n    if (s !== 0) {\n      target[0] /= s;\n      target[1] /= s;\n      target[2] /= s;\n    } else {\n      target[0] = 0;\n      target[1] = 0;\n      target[2] = 0;\n    }\n    return this;\n  },\n  cross: function(target, a) {\n    var x = target[0];\n    var y = target[1];\n    var z = target[2];\n    target[0] = y*a[2] - z*a[1];\n    target[1] = z*a[0] - x*a[2];\n    target[2] = x*a[1] - y*a[0];\n    return this;\n  },\n  crossVectors: function(target, a, b) {\n    target[0] = a[1]*b[2] - a[2]*b[1];\n    target[1] = a[2]*b[0] - a[0]*b[2];\n    target[2] = a[0]*b[1] - a[1]*b[0];\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  },\n  limit: function(target, min, max) {\n    var length = this.length(target);\n    if (min !== null && length < min) {\n      this.setLength(target, min);\n    } else if (max !== null && length > max) {\n      this.setLength(target, max);\n    }\n    return this;\n  },\n  dot: function(a, b) {\n    return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n  },\n  normalise: function(target) {\n    return this.divideScalar(target, this.length(target));\n  },\n  negate: function(target) {\n    return this.multiplyScalar(target, -1);\n  },\n  distanceSquared: function(a, b) {\n    var dx = a[0] - b[0];\n    var dy = a[1] - b[1];\n    var dz = a[2] - b[2];\n    return dx*dx + dy*dy + dz*dz;\n  },\n  distance: function(a, b) {\n    return Math.sqrt(this.distanceSquared(a, b));\n  },\n  lengthSquared: function(a) {\n    return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];\n  },\n  length: function(a) {\n    return Math.sqrt(this.lengthSquared(a));\n  },\n  setLength: function(target, l) {\n    var length = this.length(target);\n    if (length !== 0 && l !== length) {\n      this.multiplyScalar(target, l / length);\n    }\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Vector4.js",
    "content": "/**\n * @object Vector4\n * @author Matthew Wagerfield\n */\nFSS.Vector4 = {\n  create: function(x, y, z, w) {\n    var vector = new FSS.Array(4);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  set: function(target, x, y, z, w) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    target[3] = w || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  setW: function(target, w) {\n    target[3] = w || 0;\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    target[3] += a[3];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    target[3] = a[3] * b[3];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    target[3] *= s;\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    if (target[3] < value) { target[3] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    if (target[3] > value) { target[3] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss/Vertex.js",
    "content": "/**\n * @class Vertex\n * @author Matthew Wagerfield\n */\nFSS.Vertex = function(x, y, z) {\n  this.position = FSS.Vector3.create(x, y, z);\n};\n\nFSS.Vertex.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/fss.js",
    "content": "//============================================================\n//\n// Copyright (C) 2013 Matthew Wagerfield\n//\n// Twitter: https://twitter.com/mwagerfield\n//\n// Permission is hereby granted, free of charge, to any\n// person obtaining a copy of this software and associated\n// documentation files (the \"Software\"), to deal in the\n// Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute,\n// sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do\n// so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice\n// shall be included in all copies or substantial portions\n// of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY\n// OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n// EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\n// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n// OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//============================================================\n\n/**\n * Defines the Flat Surface Shader namespace for all the awesomeness to exist upon.\n * @author Matthew Wagerfield\n */\nFSS = {\n  FRONT  : 0,\n  BACK   : 1,\n  DOUBLE : 2,\n  SVGNS  : 'http://www.w3.org/2000/svg'\n};\n\n/**\n * @class Array\n * @author Matthew Wagerfield\n */\nFSS.Array = typeof Float32Array === 'function' ? Float32Array : Array;\n\n/**\n * @class Utils\n * @author Matthew Wagerfield\n */\nFSS.Utils = {\n  isNumber: function(value) {\n    return !isNaN(parseFloat(value)) && isFinite(value);\n  }\n};\n\n/**\n * Request Animation Frame Polyfill.\n * @author Paul Irish\n * @see https://gist.github.com/paulirish/1579671\n */\n(function() {\n\n  var lastTime = 0;\n  var vendors = ['ms', 'moz', 'webkit', 'o'];\n\n  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n    window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];\n    window.cancelAnimationFrame  = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];\n  }\n\n  if (!window.requestAnimationFrame) {\n    window.requestAnimationFrame = function(callback, element) {\n      var currentTime = new Date().getTime();\n      var timeToCall = Math.max(0, 16 - (currentTime - lastTime));\n      var id = window.setTimeout(function() {\n        callback(currentTime + timeToCall);\n      }, timeToCall);\n      lastTime = currentTime + timeToCall;\n      return id;\n    };\n  }\n\n  if (!window.cancelAnimationFrame) {\n    window.cancelAnimationFrame = function(id) {\n      clearTimeout(id);\n    };\n  }\n\n}());\n\n/**\n * @object Math Augmentation\n * @author Matthew Wagerfield\n */\nMath.PIM2 = Math.PI*2;\nMath.PID2 = Math.PI/2;\nMath.randomInRange = function(min, max) {\n  return min + (max - min) * Math.random();\n};\nMath.clamp = function(value, min, max) {\n  value = Math.max(value, min);\n  value = Math.min(value, max);\n  return value;\n};\n\n/**\n * @object Vector3\n * @author Matthew Wagerfield\n */\nFSS.Vector3 = {\n  create: function(x, y, z) {\n    var vector = new FSS.Array(3);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  clone: function(a) {\n    var vector = this.create();\n    this.copy(vector, a);\n    return vector;\n  },\n  set: function(target, x, y, z) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  copy: function(target, a) {\n    target[0] = a[0];\n    target[1] = a[1];\n    target[2] = a[2];\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    return this;\n  },\n  addVectors: function(target, a, b) {\n    target[0] = a[0] + b[0];\n    target[1] = a[1] + b[1];\n    target[2] = a[2] + b[2];\n    return this;\n  },\n  addScalar: function(target, s) {\n    target[0] += s;\n    target[1] += s;\n    target[2] += s;\n    return this;\n  },\n  subtract: function(target, a) {\n    target[0] -= a[0];\n    target[1] -= a[1];\n    target[2] -= a[2];\n    return this;\n  },\n  subtractVectors: function(target, a, b) {\n    target[0] = a[0] - b[0];\n    target[1] = a[1] - b[1];\n    target[2] = a[2] - b[2];\n    return this;\n  },\n  subtractScalar: function(target, s) {\n    target[0] -= s;\n    target[1] -= s;\n    target[2] -= s;\n    return this;\n  },\n  multiply: function(target, a) {\n    target[0] *= a[0];\n    target[1] *= a[1];\n    target[2] *= a[2];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    return this;\n  },\n  divide: function(target, a) {\n    target[0] /= a[0];\n    target[1] /= a[1];\n    target[2] /= a[2];\n    return this;\n  },\n  divideVectors: function(target, a, b) {\n    target[0] = a[0] / b[0];\n    target[1] = a[1] / b[1];\n    target[2] = a[2] / b[2];\n    return this;\n  },\n  divideScalar: function(target, s) {\n    if (s !== 0) {\n      target[0] /= s;\n      target[1] /= s;\n      target[2] /= s;\n    } else {\n      target[0] = 0;\n      target[1] = 0;\n      target[2] = 0;\n    }\n    return this;\n  },\n  cross: function(target, a) {\n    var x = target[0];\n    var y = target[1];\n    var z = target[2];\n    target[0] = y*a[2] - z*a[1];\n    target[1] = z*a[0] - x*a[2];\n    target[2] = x*a[1] - y*a[0];\n    return this;\n  },\n  crossVectors: function(target, a, b) {\n    target[0] = a[1]*b[2] - a[2]*b[1];\n    target[1] = a[2]*b[0] - a[0]*b[2];\n    target[2] = a[0]*b[1] - a[1]*b[0];\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  },\n  limit: function(target, min, max) {\n    var length = this.length(target);\n    if (min !== null && length < min) {\n      this.setLength(target, min);\n    } else if (max !== null && length > max) {\n      this.setLength(target, max);\n    }\n    return this;\n  },\n  dot: function(a, b) {\n    return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n  },\n  normalise: function(target) {\n    return this.divideScalar(target, this.length(target));\n  },\n  negate: function(target) {\n    return this.multiplyScalar(target, -1);\n  },\n  distanceSquared: function(a, b) {\n    var dx = a[0] - b[0];\n    var dy = a[1] - b[1];\n    var dz = a[2] - b[2];\n    return dx*dx + dy*dy + dz*dz;\n  },\n  distance: function(a, b) {\n    return Math.sqrt(this.distanceSquared(a, b));\n  },\n  lengthSquared: function(a) {\n    return a[0]*a[0] + a[1]*a[1] + a[2]*a[2];\n  },\n  length: function(a) {\n    return Math.sqrt(this.lengthSquared(a));\n  },\n  setLength: function(target, l) {\n    var length = this.length(target);\n    if (length !== 0 && l !== length) {\n      this.multiplyScalar(target, l / length);\n    }\n    return this;\n  }\n};\n\n/**\n * @object Vector4\n * @author Matthew Wagerfield\n */\nFSS.Vector4 = {\n  create: function(x, y, z, w) {\n    var vector = new FSS.Array(4);\n    this.set(vector, x, y, z);\n    return vector;\n  },\n  set: function(target, x, y, z, w) {\n    target[0] = x || 0;\n    target[1] = y || 0;\n    target[2] = z || 0;\n    target[3] = w || 0;\n    return this;\n  },\n  setX: function(target, x) {\n    target[0] = x || 0;\n    return this;\n  },\n  setY: function(target, y) {\n    target[1] = y || 0;\n    return this;\n  },\n  setZ: function(target, z) {\n    target[2] = z || 0;\n    return this;\n  },\n  setW: function(target, w) {\n    target[3] = w || 0;\n    return this;\n  },\n  add: function(target, a) {\n    target[0] += a[0];\n    target[1] += a[1];\n    target[2] += a[2];\n    target[3] += a[3];\n    return this;\n  },\n  multiplyVectors: function(target, a, b) {\n    target[0] = a[0] * b[0];\n    target[1] = a[1] * b[1];\n    target[2] = a[2] * b[2];\n    target[3] = a[3] * b[3];\n    return this;\n  },\n  multiplyScalar: function(target, s) {\n    target[0] *= s;\n    target[1] *= s;\n    target[2] *= s;\n    target[3] *= s;\n    return this;\n  },\n  min: function(target, value) {\n    if (target[0] < value) { target[0] = value; }\n    if (target[1] < value) { target[1] = value; }\n    if (target[2] < value) { target[2] = value; }\n    if (target[3] < value) { target[3] = value; }\n    return this;\n  },\n  max: function(target, value) {\n    if (target[0] > value) { target[0] = value; }\n    if (target[1] > value) { target[1] = value; }\n    if (target[2] > value) { target[2] = value; }\n    if (target[3] > value) { target[3] = value; }\n    return this;\n  },\n  clamp: function(target, min, max) {\n    this.min(target, min);\n    this.max(target, max);\n    return this;\n  }\n};\n\n/**\n * @class Color\n * @author Matthew Wagerfield\n */\nFSS.Color = function(hex, opacity) {\n  this.rgba = FSS.Vector4.create();\n  this.hex = hex || '#000000';\n  this.opacity = FSS.Utils.isNumber(opacity) ? opacity : 1;\n  this.set(this.hex, this.opacity);\n};\n\nFSS.Color.prototype = {\n  set: function(hex, opacity) {\n    hex = hex.replace('#', '');\n    var size = hex.length / 3;\n    this.rgba[0] = parseInt(hex.substring(size*0, size*1), 16) / 255;\n    this.rgba[1] = parseInt(hex.substring(size*1, size*2), 16) / 255;\n    this.rgba[2] = parseInt(hex.substring(size*2, size*3), 16) / 255;\n    this.rgba[3] = FSS.Utils.isNumber(opacity) ? opacity : this.rgba[3];\n    return this;\n  },\n  hexify: function(channel) {\n    var hex = Math.ceil(channel*255).toString(16);\n    if (hex.length === 1) { hex = '0' + hex; }\n    return hex;\n  },\n  format: function() {\n    var r = this.hexify(this.rgba[0]);\n    var g = this.hexify(this.rgba[1]);\n    var b = this.hexify(this.rgba[2]);\n    this.hex = '#' + r + g + b;\n    return this.hex;\n  }\n};\n\n/**\n * @class Object\n * @author Matthew Wagerfield\n */\nFSS.Object = function() {\n  this.position = FSS.Vector3.create();\n};\n\nFSS.Object.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n\n/**\n * @class Light\n * @author Matthew Wagerfield\n */\nFSS.Light = function(ambient, diffuse) {\n  FSS.Object.call(this);\n  this.ambient = new FSS.Color(ambient || '#FFFFFF');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.ray = FSS.Vector3.create();\n};\n\nFSS.Light.prototype = Object.create(FSS.Object.prototype);\n\n/**\n * @class Vertex\n * @author Matthew Wagerfield\n */\nFSS.Vertex = function(x, y, z) {\n  this.position = FSS.Vector3.create(x, y, z);\n};\n\nFSS.Vertex.prototype = {\n  setPosition: function(x, y, z) {\n    FSS.Vector3.set(this.position, x, y, z);\n    return this;\n  }\n};\n\n/**\n * @class Triangle\n * @author Matthew Wagerfield\n */\nFSS.Triangle = function(a, b, c, s, material) {\n  this.a = a || new FSS.Vertex();\n  this.b = b || new FSS.Vertex();\n  this.c = c || new FSS.Vertex();\n  this.vertices = [this.a, this.b, this.c];\n  this.u = FSS.Vector3.create();\n  this.v = FSS.Vector3.create();\n  this.centroid = FSS.Vector3.create();\n  this.normal = FSS.Vector3.create();\n  this.material = material || new FSS.Material();\n  this.color = new FSS.Color();\n  this.polygon = s.polygon();\n  this.polygon.attr({\n    'stroke-linejoin': 'round',\n\t'stroke-miterlimit': 1,\n\t'stroke-width': 1\n  });\n\n  this.computeCentroid();\n  this.computeNormal();\n};\n\nFSS.Triangle.prototype = {\n  computeCentroid: function() {\n    this.centroid[0] = this.a.position[0] + this.b.position[0] + this.c.position[0];\n    this.centroid[1] = this.a.position[1] + this.b.position[1] + this.c.position[1];\n    this.centroid[2] = this.a.position[2] + this.b.position[2] + this.c.position[2];\n    FSS.Vector3.divideScalar(this.centroid, 3);\n    return this;\n  },\n  computeNormal: function() {\n    FSS.Vector3.subtractVectors(this.u, this.b.position, this.a.position);\n    FSS.Vector3.subtractVectors(this.v, this.c.position, this.a.position);\n    FSS.Vector3.crossVectors(this.normal, this.u, this.v);\n    FSS.Vector3.normalise(this.normal);\n    return this;\n  }\n};\n\n/**\n * @class Geometry\n * @author Matthew Wagerfield\n */\nFSS.Geometry = function() {\n  this.vertices = [];\n  this.triangles = [];\n  this.dirty = false;\n};\n\nFSS.Geometry.prototype = {\n  update: function() {\n    if (this.dirty) {\n      var t,triangle;\n      for (t = this.triangles.length - 1; t >= 0; t--) {\n        triangle = this.triangles[t];\n        triangle.computeCentroid();\n        triangle.computeNormal();\n      }\n      this.dirty = false;\n    }\n    return this;\n  }\n};\n\n/**\n * @class Plane\n * @author Matthew Wagerfield\n */\nFSS.Plane = function(width, height, segments, slices, s, material) {\n  FSS.Geometry.call(this);\n  this.width = width || 100;\n  this.height = height || 100;\n  this.segments = segments || 4;\n  this.slices = slices || 4;\n  this.segmentWidth = this.width / this.segments;\n  this.sliceHeight = this.height / this.slices;\n\n  // Cache Variables\n  var x, y, v0, v1, v2, v3,\n      vertex, triangle, vertices = [],\n      offsetX = this.width * -0.5,\n      offsetY = this.height * 0.5;\n\n  // Add Vertices\n  for (x = 0; x <= this.segments; x++) {\n    vertices.push([]);\n    for (y = 0; y <= this.slices; y++) {\n      vertex = new FSS.Vertex(offsetX + x*this.segmentWidth, offsetY - y*this.sliceHeight);\n      vertices[x].push(vertex);\n      this.vertices.push(vertex);\n    }\n  }\n\n  // Add Triangles\n  for (x = 0; x < this.segments; x++) {\n    for (y = 0; y < this.slices; y++) {\n      v0 = vertices[x+0][y+0];\n      v1 = vertices[x+0][y+1];\n      v2 = vertices[x+1][y+0];\n      v3 = vertices[x+1][y+1];\n      t0 = new FSS.Triangle(v0, v1, v2, s, material);\n      t1 = new FSS.Triangle(v2, v1, v3, s, material);\n      this.triangles.push(t0, t1);\n    }\n  }\n};\n\nFSS.Plane.prototype = Object.create(FSS.Geometry.prototype);\n\n/**\n * @class Material\n * @author Matthew Wagerfield\n */\nFSS.Material = function(ambient, diffuse) {\n  this.ambient = new FSS.Color(ambient || '#444444');\n  this.diffuse = new FSS.Color(diffuse || '#FFFFFF');\n  this.slave = new FSS.Color();\n};\n\n/**\n * @class Mesh\n * @author Matthew Wagerfield\n */\nFSS.Mesh = function(geometry, material) {\n  FSS.Object.call(this);\n  this.geometry = geometry || new FSS.Geometry();\n  this.material = material || new FSS.Material();\n  this.side = FSS.FRONT;\n  this.visible = true;\n};\n\nFSS.Mesh.prototype = Object.create(FSS.Object.prototype);\n\nFSS.Mesh.prototype.update = function(lights, calculate) {\n  var t,triangle, l,light, illuminance;\n\n  // Update Geometry\n  this.geometry.update();\n\n  // Calculate the triangle colors\n  if (calculate) {\n\n    // Iterate through Triangles\n    for (t = this.geometry.triangles.length - 1; t >= 0; t--) {\n      triangle = this.geometry.triangles[t];\n\n      // Reset Triangle Color\n      FSS.Vector4.set(triangle.color.rgba);\n\n      // Iterate through Lights\n      for (l = lights.length - 1; l >= 0; l--) {\n        light = lights[l];\n\n        // Calculate Illuminance\n        FSS.Vector3.subtractVectors(light.ray, light.position, triangle.centroid);\n        FSS.Vector3.normalise(light.ray);\n        illuminance = FSS.Vector3.dot(triangle.normal, light.ray);\n        if (this.side === FSS.FRONT) {\n          illuminance = Math.max(illuminance, 0);\n        } else if (this.side === FSS.BACK) {\n          illuminance = Math.abs(Math.min(illuminance, 0));\n        } else if (this.side === FSS.DOUBLE) {\n          illuminance = Math.max(Math.abs(illuminance), 0);\n        }\n\n        // Calculate Ambient Light\n        FSS.Vector4.multiplyVectors(triangle.material.slave.rgba, triangle.material.ambient.rgba, light.ambient.rgba);\n        FSS.Vector4.add(triangle.color.rgba, triangle.material.slave.rgba);\n\n        // Calculate Diffuse Light\n        FSS.Vector4.multiplyVectors(triangle.material.slave.rgba, triangle.material.diffuse.rgba, light.diffuse.rgba);\n        FSS.Vector4.multiplyScalar(triangle.material.slave.rgba, illuminance);\n        FSS.Vector4.add(triangle.color.rgba, triangle.material.slave.rgba);\n      }\n\n      // Clamp & Format Color\n      FSS.Vector4.clamp(triangle.color.rgba, 0, 1);\n    }\n  }\n  return this;\n};\n\n/**\n * @class Scene\n * @author Matthew Wagerfield\n */\nFSS.Scene = function() {\n  this.meshes = [];\n  this.lights = [];\n};\n\nFSS.Scene.prototype = {\n  add: function(object) {\n    if (object instanceof FSS.Mesh && !~this.meshes.indexOf(object)) {\n      this.meshes.push(object);\n    } else if (object instanceof FSS.Light && !~this.lights.indexOf(object)) {\n      this.lights.push(object);\n    }\n    return this;\n  },\n  remove: function(object) {\n    if (object instanceof FSS.Mesh && ~this.meshes.indexOf(object)) {\n      this.meshes.splice(this.meshes.indexOf(object), 1);\n    } else if (object instanceof FSS.Light && ~this.lights.indexOf(object)) {\n      this.lights.splice(this.lights.indexOf(object), 1);\n    }\n    return this;\n  }\n};\n\n/**\n * @class Renderer\n * @author Matthew Wagerfield\n */\nFSS.Renderer = function() {\n  this.width = 0;\n  this.height = 0;\n  this.halfWidth = 0;\n  this.halfHeight = 0;\n};\n\nFSS.Renderer.prototype = {\n  setSize: function(width, height) {\n    if (this.width === width && this.height === height) return;\n    this.width = width;\n    this.height = height;\n    this.halfWidth = this.width * 0.5;\n    this.halfHeight = this.height * 0.5;\n    return this;\n  },\n  clear: function() {\n    return this;\n  },\n  render: function(scene) {\n    return this;\n  }\n};\n\n/**\n * @class SVG Renderer\n * @author Matthew Wagerfield\n */\nFSS.SVGRenderer = function(s) {\n  FSS.Renderer.call(this);\n  this.element = s.g();\n};\n\nFSS.SVGRenderer.prototype = Object.create(FSS.Renderer.prototype);\n\nFSS.SVGRenderer.prototype.setSize = function(width, height) {\n  FSS.Renderer.prototype.setSize.call(this, width, height);\n  return this;\n};\n\nFSS.SVGRenderer.prototype.clear = function() {\n  FSS.Renderer.prototype.clear.call(this);\n  for (var i = this.element.childNodes.length - 1; i >= 0; i--) {\n    this.element.removeChild(this.element.childNodes[i]);\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.render = function(scene) {\n  FSS.Renderer.prototype.render.call(this, scene);\n  var m,mesh, t,triangle, points, style;\n\n  // Update Meshes\n  for (m = scene.meshes.length - 1; m >= 0; m--) {\n    mesh = scene.meshes[m];\n    if (mesh.visible) {\n      mesh.update(scene.lights, true);\n\n      // Render Triangles\n      for (t = mesh.geometry.triangles.length - 1; t >= 0; t--) {\n        triangle = mesh.geometry.triangles[t];\n\n\t\tif (triangle.polygon.parent() !== this.element) {\n\t\t\tthis.element.append(triangle.polygon);\n\t\t}\n\t\t\n        points  = this.formatPoint(triangle.a)+' ';\n        points += this.formatPoint(triangle.b)+' ';\n        points += this.formatPoint(triangle.c);\n        style = this.formatStyle(triangle.color.format());\n\t\t\n\t\ttriangle.polygon.attr({\n\t\t\tpoints: points,\n\t\t\tstyle: style\n\t\t});\n      }\n    }\n  }\n  return this;\n};\n\nFSS.SVGRenderer.prototype.formatPoint = function(vertex) {\n  return (this.halfWidth+vertex.position[0])+','+(this.halfHeight-vertex.position[1]);\n};\n\nFSS.SVGRenderer.prototype.formatStyle = function(color) {\n  var style = 'fill:'+color+';';\n  style += 'stroke:'+color+';';\n  return style;\n};\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/require.js",
    "content": "/** vim: et:ts=4:sw=4:sts=4\n * @license RequireJS 2.1.5 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 */\n//Not using strict: uneven strict support in browsers, #392, and causes\n//problems with requirejs.exec()/transpiler plugins that may not be strict.\n/*jslint regexp: true, nomen: true, sloppy: true */\n/*global window, navigator, document, importScripts, setTimeout, opera */\n\nvar requirejs, require, define;\n(function (global) {\n    var req, s, head, baseElement, dataMain, src,\n        interactiveScript, currentlyAddingScript, mainScript, subPath,\n        version = '2.1.5',\n        commentRegExp = /(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,\n        cjsRequireRegExp = /[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,\n        jsSuffixRegExp = /\\.js$/,\n        currDirRegExp = /^\\.\\//,\n        op = Object.prototype,\n        ostring = op.toString,\n        hasOwn = op.hasOwnProperty,\n        ap = Array.prototype,\n        apsp = ap.splice,\n        isBrowser = !!(typeof window !== 'undefined' && navigator && document),\n        isWebWorker = !isBrowser && typeof importScripts !== 'undefined',\n        //PS3 indicates loaded and complete, but need to wait for complete\n        //specifically. Sequence is 'loading', 'loaded', execution,\n        // then 'complete'. The UA check is unfortunate, but not sure how\n        //to feature test w/o causing perf issues.\n        readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?\n                      /^complete$/ : /^(complete|loaded)$/,\n        defContextName = '_',\n        //Oh the tragedy, detecting opera. See the usage of isOpera for reason.\n        isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',\n        contexts = {},\n        cfg = {},\n        globalDefQueue = [],\n        useInteractive = false;\n\n    function isFunction(it) {\n        return ostring.call(it) === '[object Function]';\n    }\n\n    function isArray(it) {\n        return ostring.call(it) === '[object Array]';\n    }\n\n    /**\n     * Helper function for iterating over an array. If the func returns\n     * a true value, it will break out of the loop.\n     */\n    function each(ary, func) {\n        if (ary) {\n            var i;\n            for (i = 0; i < ary.length; i += 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Helper function for iterating over an array backwards. If the func\n     * returns a true value, it will break out of the loop.\n     */\n    function eachReverse(ary, func) {\n        if (ary) {\n            var i;\n            for (i = ary.length - 1; i > -1; i -= 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    function getOwn(obj, prop) {\n        return hasProp(obj, prop) && obj[prop];\n    }\n\n    /**\n     * Cycles over properties in an object and calls a function for each\n     * property value. If the function returns a truthy value, then the\n     * iteration is stopped.\n     */\n    function eachProp(obj, func) {\n        var prop;\n        for (prop in obj) {\n            if (hasProp(obj, prop)) {\n                if (func(obj[prop], prop)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Simple function to mix in properties from source into target,\n     * but only if target does not already have a property of the same name.\n     */\n    function mixin(target, source, force, deepStringMixin) {\n        if (source) {\n            eachProp(source, function (value, prop) {\n                if (force || !hasProp(target, prop)) {\n                    if (deepStringMixin && typeof value !== 'string') {\n                        if (!target[prop]) {\n                            target[prop] = {};\n                        }\n                        mixin(target[prop], value, force, deepStringMixin);\n                    } else {\n                        target[prop] = value;\n                    }\n                }\n            });\n        }\n        return target;\n    }\n\n    //Similar to Function.prototype.bind, but the 'this' object is specified\n    //first, since it is easier to read/figure out what 'this' will be.\n    function bind(obj, fn) {\n        return function () {\n            return fn.apply(obj, arguments);\n        };\n    }\n\n    function scripts() {\n        return document.getElementsByTagName('script');\n    }\n\n    //Allow getting a global that expressed in\n    //dot notation, like 'a.b.c'.\n    function getGlobal(value) {\n        if (!value) {\n            return value;\n        }\n        var g = global;\n        each(value.split('.'), function (part) {\n            g = g[part];\n        });\n        return g;\n    }\n\n    /**\n     * Constructs an error with a pointer to an URL with more information.\n     * @param {String} id the error ID that maps to an ID on a web page.\n     * @param {String} message human readable error.\n     * @param {Error} [err] the original error, if there is one.\n     *\n     * @returns {Error}\n     */\n    function makeError(id, msg, err, requireModules) {\n        var e = new Error(msg + '\\nhttp://requirejs.org/docs/errors.html#' + id);\n        e.requireType = id;\n        e.requireModules = requireModules;\n        if (err) {\n            e.originalError = err;\n        }\n        return e;\n    }\n\n    if (typeof define !== 'undefined') {\n        //If a define is already in play via another AMD loader,\n        //do not overwrite.\n        return;\n    }\n\n    if (typeof requirejs !== 'undefined') {\n        if (isFunction(requirejs)) {\n            //Do not overwrite and existing requirejs instance.\n            return;\n        }\n        cfg = requirejs;\n        requirejs = undefined;\n    }\n\n    //Allow for a require config object\n    if (typeof require !== 'undefined' && !isFunction(require)) {\n        //assume it is a config object.\n        cfg = require;\n        require = undefined;\n    }\n\n    function newContext(contextName) {\n        var inCheckLoaded, Module, context, handlers,\n            checkLoadedTimeoutId,\n            config = {\n                //Defaults. Do not set a default for map\n                //config to speed up normalize(), which\n                //will run faster if there is no default.\n                waitSeconds: 7,\n                baseUrl: './',\n                paths: {},\n                pkgs: {},\n                shim: {},\n                config: {}\n            },\n            registry = {},\n            //registry of just enabled modules, to speed\n            //cycle breaking code when lots of modules\n            //are registered, but not activated.\n            enabledRegistry = {},\n            undefEvents = {},\n            defQueue = [],\n            defined = {},\n            urlFetched = {},\n            requireCounter = 1,\n            unnormalizedCounter = 1;\n\n        /**\n         * Trims the . and .. from an array of path segments.\n         * It will keep a leading path segment if a .. will become\n         * the first path segment, to help with module name lookups,\n         * which act like paths, but can be remapped. But the end result,\n         * all paths that use this function should look normalized.\n         * NOTE: this method MODIFIES the input array.\n         * @param {Array} ary the array of path segments.\n         */\n        function trimDots(ary) {\n            var i, part;\n            for (i = 0; ary[i]; i += 1) {\n                part = ary[i];\n                if (part === '.') {\n                    ary.splice(i, 1);\n                    i -= 1;\n                } else if (part === '..') {\n                    if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {\n                        //End of the line. Keep at least one non-dot\n                        //path segment at the front so it can be mapped\n                        //correctly to disk. Otherwise, there is likely\n                        //no path mapping for a path starting with '..'.\n                        //This can still fail, but catches the most reasonable\n                        //uses of ..\n                        break;\n                    } else if (i > 0) {\n                        ary.splice(i - 1, 2);\n                        i -= 2;\n                    }\n                }\n            }\n        }\n\n        /**\n         * Given a relative module name, like ./something, normalize it to\n         * a real name that can be mapped to a path.\n         * @param {String} name the relative name\n         * @param {String} baseName a real name that the name arg is relative\n         * to.\n         * @param {Boolean} applyMap apply the map config to the value. Should\n         * only be done if this normalization is for a dependency ID.\n         * @returns {String} normalized name\n         */\n        function normalize(name, baseName, applyMap) {\n            var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment,\n                foundMap, foundI, foundStarMap, starI,\n                baseParts = baseName && baseName.split('/'),\n                normalizedBaseParts = baseParts,\n                map = config.map,\n                starMap = map && map['*'];\n\n            //Adjust any relative paths.\n            if (name && name.charAt(0) === '.') {\n                //If have a base name, try to normalize against it,\n                //otherwise, assume it is a top-level require that will\n                //be relative to baseUrl in the end.\n                if (baseName) {\n                    if (getOwn(config.pkgs, baseName)) {\n                        //If the baseName is a package name, then just treat it as one\n                        //name to concat the name with.\n                        normalizedBaseParts = baseParts = [baseName];\n                    } else {\n                        //Convert baseName to array, and lop off the last part,\n                        //so that . matches that 'directory' and not name of the baseName's\n                        //module. For instance, baseName of 'one/two/three', maps to\n                        //'one/two/three.js', but we want the directory, 'one/two' for\n                        //this normalization.\n                        normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                    }\n\n                    name = normalizedBaseParts.concat(name.split('/'));\n                    trimDots(name);\n\n                    //Some use of packages may use a . path to reference the\n                    //'main' module name, so normalize for that.\n                    pkgConfig = getOwn(config.pkgs, (pkgName = name[0]));\n                    name = name.join('/');\n                    if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {\n                        name = pkgName;\n                    }\n                } else if (name.indexOf('./') === 0) {\n                    // No baseName, so this is ID is resolved relative\n                    // to baseUrl, pull off the leading dot.\n                    name = name.substring(2);\n                }\n            }\n\n            //Apply map config if available.\n            if (applyMap && map && (baseParts || starMap)) {\n                nameParts = name.split('/');\n\n                for (i = nameParts.length; i > 0; i -= 1) {\n                    nameSegment = nameParts.slice(0, i).join('/');\n\n                    if (baseParts) {\n                        //Find the longest baseName segment match in the config.\n                        //So, do joins on the biggest to smallest lengths of baseParts.\n                        for (j = baseParts.length; j > 0; j -= 1) {\n                            mapValue = getOwn(map, baseParts.slice(0, j).join('/'));\n\n                            //baseName segment has config, find if it has one for\n                            //this name.\n                            if (mapValue) {\n                                mapValue = getOwn(mapValue, nameSegment);\n                                if (mapValue) {\n                                    //Match, update name to the new value.\n                                    foundMap = mapValue;\n                                    foundI = i;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    if (foundMap) {\n                        break;\n                    }\n\n                    //Check for a star map match, but just hold on to it,\n                    //if there is a shorter segment match later in a matching\n                    //config, then favor over this star map.\n                    if (!foundStarMap && starMap && getOwn(starMap, nameSegment)) {\n                        foundStarMap = getOwn(starMap, nameSegment);\n                        starI = i;\n                    }\n                }\n\n                if (!foundMap && foundStarMap) {\n                    foundMap = foundStarMap;\n                    foundI = starI;\n                }\n\n                if (foundMap) {\n                    nameParts.splice(0, foundI, foundMap);\n                    name = nameParts.join('/');\n                }\n            }\n\n            return name;\n        }\n\n        function removeScript(name) {\n            if (isBrowser) {\n                each(scripts(), function (scriptNode) {\n                    if (scriptNode.getAttribute('data-requiremodule') === name &&\n                            scriptNode.getAttribute('data-requirecontext') === context.contextName) {\n                        scriptNode.parentNode.removeChild(scriptNode);\n                        return true;\n                    }\n                });\n            }\n        }\n\n        function hasPathFallback(id) {\n            var pathConfig = getOwn(config.paths, id);\n            if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {\n                removeScript(id);\n                //Pop off the first array value, since it failed, and\n                //retry\n                pathConfig.shift();\n                context.require.undef(id);\n                context.require([id]);\n                return true;\n            }\n        }\n\n        //Turns a plugin!resource to [plugin, resource]\n        //with the plugin being undefined if the name\n        //did not have a plugin prefix.\n        function splitPrefix(name) {\n            var prefix,\n                index = name ? name.indexOf('!') : -1;\n            if (index > -1) {\n                prefix = name.substring(0, index);\n                name = name.substring(index + 1, name.length);\n            }\n            return [prefix, name];\n        }\n\n        /**\n         * Creates a module mapping that includes plugin prefix, module\n         * name, and path. If parentModuleMap is provided it will\n         * also normalize the name via require.normalize()\n         *\n         * @param {String} name the module name\n         * @param {String} [parentModuleMap] parent module map\n         * for the module name, used to resolve relative names.\n         * @param {Boolean} isNormalized: is the ID already normalized.\n         * This is true if this call is done for a define() module ID.\n         * @param {Boolean} applyMap: apply the map config to the ID.\n         * Should only be true if this map is for a dependency.\n         *\n         * @returns {Object}\n         */\n        function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {\n            var url, pluginModule, suffix, nameParts,\n                prefix = null,\n                parentName = parentModuleMap ? parentModuleMap.name : null,\n                originalName = name,\n                isDefine = true,\n                normalizedName = '';\n\n            //If no name, then it means it is a require call, generate an\n            //internal name.\n            if (!name) {\n                isDefine = false;\n                name = '_@r' + (requireCounter += 1);\n            }\n\n            nameParts = splitPrefix(name);\n            prefix = nameParts[0];\n            name = nameParts[1];\n\n            if (prefix) {\n                prefix = normalize(prefix, parentName, applyMap);\n                pluginModule = getOwn(defined, prefix);\n            }\n\n            //Account for relative paths if there is a base name.\n            if (name) {\n                if (prefix) {\n                    if (pluginModule && pluginModule.normalize) {\n                        //Plugin is loaded, use its normalize method.\n                        normalizedName = pluginModule.normalize(name, function (name) {\n                            return normalize(name, parentName, applyMap);\n                        });\n                    } else {\n                        normalizedName = normalize(name, parentName, applyMap);\n                    }\n                } else {\n                    //A regular module.\n                    normalizedName = normalize(name, parentName, applyMap);\n\n                    //Normalized name may be a plugin ID due to map config\n                    //application in normalize. The map config values must\n                    //already be normalized, so do not need to redo that part.\n                    nameParts = splitPrefix(normalizedName);\n                    prefix = nameParts[0];\n                    normalizedName = nameParts[1];\n                    isNormalized = true;\n\n                    url = context.nameToUrl(normalizedName);\n                }\n            }\n\n            //If the id is a plugin id that cannot be determined if it needs\n            //normalization, stamp it with a unique ID so two matching relative\n            //ids that may conflict can be separate.\n            suffix = prefix && !pluginModule && !isNormalized ?\n                     '_unnormalized' + (unnormalizedCounter += 1) :\n                     '';\n\n            return {\n                prefix: prefix,\n                name: normalizedName,\n                parentMap: parentModuleMap,\n                unnormalized: !!suffix,\n                url: url,\n                originalName: originalName,\n                isDefine: isDefine,\n                id: (prefix ?\n                        prefix + '!' + normalizedName :\n                        normalizedName) + suffix\n            };\n        }\n\n        function getModule(depMap) {\n            var id = depMap.id,\n                mod = getOwn(registry, id);\n\n            if (!mod) {\n                mod = registry[id] = new context.Module(depMap);\n            }\n\n            return mod;\n        }\n\n        function on(depMap, name, fn) {\n            var id = depMap.id,\n                mod = getOwn(registry, id);\n\n            if (hasProp(defined, id) &&\n                    (!mod || mod.defineEmitComplete)) {\n                if (name === 'defined') {\n                    fn(defined[id]);\n                }\n            } else {\n                getModule(depMap).on(name, fn);\n            }\n        }\n\n        function onError(err, errback) {\n            var ids = err.requireModules,\n                notified = false;\n\n            if (errback) {\n                errback(err);\n            } else {\n                each(ids, function (id) {\n                    var mod = getOwn(registry, id);\n                    if (mod) {\n                        //Set error on module, so it skips timeout checks.\n                        mod.error = err;\n                        if (mod.events.error) {\n                            notified = true;\n                            mod.emit('error', err);\n                        }\n                    }\n                });\n\n                if (!notified) {\n                    req.onError(err);\n                }\n            }\n        }\n\n        /**\n         * Internal method to transfer globalQueue items to this context's\n         * defQueue.\n         */\n        function takeGlobalQueue() {\n            //Push all the globalDefQueue items into the context's defQueue\n            if (globalDefQueue.length) {\n                //Array splice in the values since the context code has a\n                //local var ref to defQueue, so cannot just reassign the one\n                //on context.\n                apsp.apply(defQueue,\n                           [defQueue.length - 1, 0].concat(globalDefQueue));\n                globalDefQueue = [];\n            }\n        }\n\n        handlers = {\n            'require': function (mod) {\n                if (mod.require) {\n                    return mod.require;\n                } else {\n                    return (mod.require = context.makeRequire(mod.map));\n                }\n            },\n            'exports': function (mod) {\n                mod.usingExports = true;\n                if (mod.map.isDefine) {\n                    if (mod.exports) {\n                        return mod.exports;\n                    } else {\n                        return (mod.exports = defined[mod.map.id] = {});\n                    }\n                }\n            },\n            'module': function (mod) {\n                if (mod.module) {\n                    return mod.module;\n                } else {\n                    return (mod.module = {\n                        id: mod.map.id,\n                        uri: mod.map.url,\n                        config: function () {\n                            return (config.config && getOwn(config.config, mod.map.id)) || {};\n                        },\n                        exports: defined[mod.map.id]\n                    });\n                }\n            }\n        };\n\n        function cleanRegistry(id) {\n            //Clean up machinery used for waiting modules.\n            delete registry[id];\n            delete enabledRegistry[id];\n        }\n\n        function breakCycle(mod, traced, processed) {\n            var id = mod.map.id;\n\n            if (mod.error) {\n                mod.emit('error', mod.error);\n            } else {\n                traced[id] = true;\n                each(mod.depMaps, function (depMap, i) {\n                    var depId = depMap.id,\n                        dep = getOwn(registry, depId);\n\n                    //Only force things that have not completed\n                    //being defined, so still in the registry,\n                    //and only if it has not been matched up\n                    //in the module already.\n                    if (dep && !mod.depMatched[i] && !processed[depId]) {\n                        if (getOwn(traced, depId)) {\n                            mod.defineDep(i, defined[depId]);\n                            mod.check(); //pass false?\n                        } else {\n                            breakCycle(dep, traced, processed);\n                        }\n                    }\n                });\n                processed[id] = true;\n            }\n        }\n\n        function checkLoaded() {\n            var map, modId, err, usingPathFallback,\n                waitInterval = config.waitSeconds * 1000,\n                //It is possible to disable the wait interval by using waitSeconds of 0.\n                expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),\n                noLoads = [],\n                reqCalls = [],\n                stillLoading = false,\n                needCycleCheck = true;\n\n            //Do not bother if this call was a result of a cycle break.\n            if (inCheckLoaded) {\n                return;\n            }\n\n            inCheckLoaded = true;\n\n            //Figure out the state of all the modules.\n            eachProp(enabledRegistry, function (mod) {\n                map = mod.map;\n                modId = map.id;\n\n                //Skip things that are not enabled or in error state.\n                if (!mod.enabled) {\n                    return;\n                }\n\n                if (!map.isDefine) {\n                    reqCalls.push(mod);\n                }\n\n                if (!mod.error) {\n                    //If the module should be executed, and it has not\n                    //been inited and time is up, remember it.\n                    if (!mod.inited && expired) {\n                        if (hasPathFallback(modId)) {\n                            usingPathFallback = true;\n                            stillLoading = true;\n                        } else {\n                            noLoads.push(modId);\n                            removeScript(modId);\n                        }\n                    } else if (!mod.inited && mod.fetched && map.isDefine) {\n                        stillLoading = true;\n                        if (!map.prefix) {\n                            //No reason to keep looking for unfinished\n                            //loading. If the only stillLoading is a\n                            //plugin resource though, keep going,\n                            //because it may be that a plugin resource\n                            //is waiting on a non-plugin cycle.\n                            return (needCycleCheck = false);\n                        }\n                    }\n                }\n            });\n\n            if (expired && noLoads.length) {\n                //If wait time expired, throw error of unloaded modules.\n                err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);\n                err.contextName = context.contextName;\n                return onError(err);\n            }\n\n            //Not expired, check for a cycle.\n            if (needCycleCheck) {\n                each(reqCalls, function (mod) {\n                    breakCycle(mod, {}, {});\n                });\n            }\n\n            //If still waiting on loads, and the waiting load is something\n            //other than a plugin resource, or there are still outstanding\n            //scripts, then just try back later.\n            if ((!expired || usingPathFallback) && stillLoading) {\n                //Something is still waiting to load. Wait for it, but only\n                //if a timeout is not already in effect.\n                if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {\n                    checkLoadedTimeoutId = setTimeout(function () {\n                        checkLoadedTimeoutId = 0;\n                        checkLoaded();\n                    }, 50);\n                }\n            }\n\n            inCheckLoaded = false;\n        }\n\n        Module = function (map) {\n            this.events = getOwn(undefEvents, map.id) || {};\n            this.map = map;\n            this.shim = getOwn(config.shim, map.id);\n            this.depExports = [];\n            this.depMaps = [];\n            this.depMatched = [];\n            this.pluginMaps = {};\n            this.depCount = 0;\n\n            /* this.exports this.factory\n               this.depMaps = [],\n               this.enabled, this.fetched\n            */\n        };\n\n        Module.prototype = {\n            init: function (depMaps, factory, errback, options) {\n                options = options || {};\n\n                //Do not do more inits if already done. Can happen if there\n                //are multiple define calls for the same module. That is not\n                //a normal, common case, but it is also not unexpected.\n                if (this.inited) {\n                    return;\n                }\n\n                this.factory = factory;\n\n                if (errback) {\n                    //Register for errors on this module.\n                    this.on('error', errback);\n                } else if (this.events.error) {\n                    //If no errback already, but there are error listeners\n                    //on this module, set up an errback to pass to the deps.\n                    errback = bind(this, function (err) {\n                        this.emit('error', err);\n                    });\n                }\n\n                //Do a copy of the dependency array, so that\n                //source inputs are not modified. For example\n                //\"shim\" deps are passed in here directly, and\n                //doing a direct modification of the depMaps array\n                //would affect that config.\n                this.depMaps = depMaps && depMaps.slice(0);\n\n                this.errback = errback;\n\n                //Indicate this module has be initialized\n                this.inited = true;\n\n                this.ignore = options.ignore;\n\n                //Could have option to init this module in enabled mode,\n                //or could have been previously marked as enabled. However,\n                //the dependencies are not known until init is called. So\n                //if enabled previously, now trigger dependencies as enabled.\n                if (options.enabled || this.enabled) {\n                    //Enable this module and dependencies.\n                    //Will call this.check()\n                    this.enable();\n                } else {\n                    this.check();\n                }\n            },\n\n            defineDep: function (i, depExports) {\n                //Because of cycles, defined callback for a given\n                //export can be called more than once.\n                if (!this.depMatched[i]) {\n                    this.depMatched[i] = true;\n                    this.depCount -= 1;\n                    this.depExports[i] = depExports;\n                }\n            },\n\n            fetch: function () {\n                if (this.fetched) {\n                    return;\n                }\n                this.fetched = true;\n\n                context.startTime = (new Date()).getTime();\n\n                var map = this.map;\n\n                //If the manager is for a plugin managed resource,\n                //ask the plugin to load it now.\n                if (this.shim) {\n                    context.makeRequire(this.map, {\n                        enableBuildCallback: true\n                    })(this.shim.deps || [], bind(this, function () {\n                        return map.prefix ? this.callPlugin() : this.load();\n                    }));\n                } else {\n                    //Regular dependency.\n                    return map.prefix ? this.callPlugin() : this.load();\n                }\n            },\n\n            load: function () {\n                var url = this.map.url;\n\n                //Regular dependency.\n                if (!urlFetched[url]) {\n                    urlFetched[url] = true;\n                    context.load(this.map.id, url);\n                }\n            },\n\n            /**\n             * Checks if the module is ready to define itself, and if so,\n             * define it.\n             */\n            check: function () {\n                if (!this.enabled || this.enabling) {\n                    return;\n                }\n\n                var err, cjsModule,\n                    id = this.map.id,\n                    depExports = this.depExports,\n                    exports = this.exports,\n                    factory = this.factory;\n\n                if (!this.inited) {\n                    this.fetch();\n                } else if (this.error) {\n                    this.emit('error', this.error);\n                } else if (!this.defining) {\n                    //The factory could trigger another require call\n                    //that would result in checking this module to\n                    //define itself again. If already in the process\n                    //of doing that, skip this work.\n                    this.defining = true;\n\n                    if (this.depCount < 1 && !this.defined) {\n                        if (isFunction(factory)) {\n                            //If there is an error listener, favor passing\n                            //to that instead of throwing an error.\n                            if (this.events.error) {\n                                try {\n                                    exports = context.execCb(id, factory, depExports, exports);\n                                } catch (e) {\n                                    err = e;\n                                }\n                            } else {\n                                exports = context.execCb(id, factory, depExports, exports);\n                            }\n\n                            if (this.map.isDefine) {\n                                //If setting exports via 'module' is in play,\n                                //favor that over return value and exports. After that,\n                                //favor a non-undefined return value over exports use.\n                                cjsModule = this.module;\n                                if (cjsModule &&\n                                        cjsModule.exports !== undefined &&\n                                        //Make sure it is not already the exports value\n                                        cjsModule.exports !== this.exports) {\n                                    exports = cjsModule.exports;\n                                } else if (exports === undefined && this.usingExports) {\n                                    //exports already set the defined value.\n                                    exports = this.exports;\n                                }\n                            }\n\n                            if (err) {\n                                err.requireMap = this.map;\n                                err.requireModules = [this.map.id];\n                                err.requireType = 'define';\n                                return onError((this.error = err));\n                            }\n\n                        } else {\n                            //Just a literal value\n                            exports = factory;\n                        }\n\n                        this.exports = exports;\n\n                        if (this.map.isDefine && !this.ignore) {\n                            defined[id] = exports;\n\n                            if (req.onResourceLoad) {\n                                req.onResourceLoad(context, this.map, this.depMaps);\n                            }\n                        }\n\n                        //Clean up\n                        cleanRegistry(id);\n\n                        this.defined = true;\n                    }\n\n                    //Finished the define stage. Allow calling check again\n                    //to allow define notifications below in the case of a\n                    //cycle.\n                    this.defining = false;\n\n                    if (this.defined && !this.defineEmitted) {\n                        this.defineEmitted = true;\n                        this.emit('defined', this.exports);\n                        this.defineEmitComplete = true;\n                    }\n\n                }\n            },\n\n            callPlugin: function () {\n                var map = this.map,\n                    id = map.id,\n                    //Map already normalized the prefix.\n                    pluginMap = makeModuleMap(map.prefix);\n\n                //Mark this as a dependency for this plugin, so it\n                //can be traced for cycles.\n                this.depMaps.push(pluginMap);\n\n                on(pluginMap, 'defined', bind(this, function (plugin) {\n                    var load, normalizedMap, normalizedMod,\n                        name = this.map.name,\n                        parentName = this.map.parentMap ? this.map.parentMap.name : null,\n                        localRequire = context.makeRequire(map.parentMap, {\n                            enableBuildCallback: true\n                        });\n\n                    //If current map is not normalized, wait for that\n                    //normalized name to load instead of continuing.\n                    if (this.map.unnormalized) {\n                        //Normalize the ID if the plugin allows it.\n                        if (plugin.normalize) {\n                            name = plugin.normalize(name, function (name) {\n                                return normalize(name, parentName, true);\n                            }) || '';\n                        }\n\n                        //prefix and name should already be normalized, no need\n                        //for applying map config again either.\n                        normalizedMap = makeModuleMap(map.prefix + '!' + name,\n                                                      this.map.parentMap);\n                        on(normalizedMap,\n                            'defined', bind(this, function (value) {\n                                this.init([], function () { return value; }, null, {\n                                    enabled: true,\n                                    ignore: true\n                                });\n                            }));\n\n                        normalizedMod = getOwn(registry, normalizedMap.id);\n                        if (normalizedMod) {\n                            //Mark this as a dependency for this plugin, so it\n                            //can be traced for cycles.\n                            this.depMaps.push(normalizedMap);\n\n                            if (this.events.error) {\n                                normalizedMod.on('error', bind(this, function (err) {\n                                    this.emit('error', err);\n                                }));\n                            }\n                            normalizedMod.enable();\n                        }\n\n                        return;\n                    }\n\n                    load = bind(this, function (value) {\n                        this.init([], function () { return value; }, null, {\n                            enabled: true\n                        });\n                    });\n\n                    load.error = bind(this, function (err) {\n                        this.inited = true;\n                        this.error = err;\n                        err.requireModules = [id];\n\n                        //Remove temp unnormalized modules for this module,\n                        //since they will never be resolved otherwise now.\n                        eachProp(registry, function (mod) {\n                            if (mod.map.id.indexOf(id + '_unnormalized') === 0) {\n                                cleanRegistry(mod.map.id);\n                            }\n                        });\n\n                        onError(err);\n                    });\n\n                    //Allow plugins to load other code without having to know the\n                    //context or how to 'complete' the load.\n                    load.fromText = bind(this, function (text, textAlt) {\n                        /*jslint evil: true */\n                        var moduleName = map.name,\n                            moduleMap = makeModuleMap(moduleName),\n                            hasInteractive = useInteractive;\n\n                        //As of 2.1.0, support just passing the text, to reinforce\n                        //fromText only being called once per resource. Still\n                        //support old style of passing moduleName but discard\n                        //that moduleName in favor of the internal ref.\n                        if (textAlt) {\n                            text = textAlt;\n                        }\n\n                        //Turn off interactive script matching for IE for any define\n                        //calls in the text, then turn it back on at the end.\n                        if (hasInteractive) {\n                            useInteractive = false;\n                        }\n\n                        //Prime the system by creating a module instance for\n                        //it.\n                        getModule(moduleMap);\n\n                        //Transfer any config to this other module.\n                        if (hasProp(config.config, id)) {\n                            config.config[moduleName] = config.config[id];\n                        }\n\n                        try {\n                            req.exec(text);\n                        } catch (e) {\n                            return onError(makeError('fromtexteval',\n                                             'fromText eval for ' + id +\n                                            ' failed: ' + e,\n                                             e,\n                                             [id]));\n                        }\n\n                        if (hasInteractive) {\n                            useInteractive = true;\n                        }\n\n                        //Mark this as a dependency for the plugin\n                        //resource\n                        this.depMaps.push(moduleMap);\n\n                        //Support anonymous modules.\n                        context.completeLoad(moduleName);\n\n                        //Bind the value of that module to the value for this\n                        //resource ID.\n                        localRequire([moduleName], load);\n                    });\n\n                    //Use parentName here since the plugin's name is not reliable,\n                    //could be some weird string with no path that actually wants to\n                    //reference the parentName's path.\n                    plugin.load(map.name, localRequire, load, config);\n                }));\n\n                context.enable(pluginMap, this);\n                this.pluginMaps[pluginMap.id] = pluginMap;\n            },\n\n            enable: function () {\n                enabledRegistry[this.map.id] = this;\n                this.enabled = true;\n\n                //Set flag mentioning that the module is enabling,\n                //so that immediate calls to the defined callbacks\n                //for dependencies do not trigger inadvertent load\n                //with the depCount still being zero.\n                this.enabling = true;\n\n                //Enable each dependency\n                each(this.depMaps, bind(this, function (depMap, i) {\n                    var id, mod, handler;\n\n                    if (typeof depMap === 'string') {\n                        //Dependency needs to be converted to a depMap\n                        //and wired up to this module.\n                        depMap = makeModuleMap(depMap,\n                                               (this.map.isDefine ? this.map : this.map.parentMap),\n                                               false,\n                                               !this.skipMap);\n                        this.depMaps[i] = depMap;\n\n                        handler = getOwn(handlers, depMap.id);\n\n                        if (handler) {\n                            this.depExports[i] = handler(this);\n                            return;\n                        }\n\n                        this.depCount += 1;\n\n                        on(depMap, 'defined', bind(this, function (depExports) {\n                            this.defineDep(i, depExports);\n                            this.check();\n                        }));\n\n                        if (this.errback) {\n                            on(depMap, 'error', this.errback);\n                        }\n                    }\n\n                    id = depMap.id;\n                    mod = registry[id];\n\n                    //Skip special modules like 'require', 'exports', 'module'\n                    //Also, don't call enable if it is already enabled,\n                    //important in circular dependency cases.\n                    if (!hasProp(handlers, id) && mod && !mod.enabled) {\n                        context.enable(depMap, this);\n                    }\n                }));\n\n                //Enable each plugin that is used in\n                //a dependency\n                eachProp(this.pluginMaps, bind(this, function (pluginMap) {\n                    var mod = getOwn(registry, pluginMap.id);\n                    if (mod && !mod.enabled) {\n                        context.enable(pluginMap, this);\n                    }\n                }));\n\n                this.enabling = false;\n\n                this.check();\n            },\n\n            on: function (name, cb) {\n                var cbs = this.events[name];\n                if (!cbs) {\n                    cbs = this.events[name] = [];\n                }\n                cbs.push(cb);\n            },\n\n            emit: function (name, evt) {\n                each(this.events[name], function (cb) {\n                    cb(evt);\n                });\n                if (name === 'error') {\n                    //Now that the error handler was triggered, remove\n                    //the listeners, since this broken Module instance\n                    //can stay around for a while in the registry.\n                    delete this.events[name];\n                }\n            }\n        };\n\n        function callGetModule(args) {\n            //Skip modules already defined.\n            if (!hasProp(defined, args[0])) {\n                getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);\n            }\n        }\n\n        function removeListener(node, func, name, ieName) {\n            //Favor detachEvent because of IE9\n            //issue, see attachEvent/addEventListener comment elsewhere\n            //in this file.\n            if (node.detachEvent && !isOpera) {\n                //Probably IE. If not it will throw an error, which will be\n                //useful to know.\n                if (ieName) {\n                    node.detachEvent(ieName, func);\n                }\n            } else {\n                node.removeEventListener(name, func, false);\n            }\n        }\n\n        /**\n         * Given an event from a script node, get the requirejs info from it,\n         * and then removes the event listeners on the node.\n         * @param {Event} evt\n         * @returns {Object}\n         */\n        function getScriptData(evt) {\n            //Using currentTarget instead of target for Firefox 2.0's sake. Not\n            //all old browsers will be supported, but this one was easy enough\n            //to support and still makes sense.\n            var node = evt.currentTarget || evt.srcElement;\n\n            //Remove the listeners once here.\n            removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');\n            removeListener(node, context.onScriptError, 'error');\n\n            return {\n                node: node,\n                id: node && node.getAttribute('data-requiremodule')\n            };\n        }\n\n        function intakeDefines() {\n            var args;\n\n            //Any defined modules in the global queue, intake them now.\n            takeGlobalQueue();\n\n            //Make sure any remaining defQueue items get properly processed.\n            while (defQueue.length) {\n                args = defQueue.shift();\n                if (args[0] === null) {\n                    return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));\n                } else {\n                    //args are id, deps, factory. Should be normalized by the\n                    //define() function.\n                    callGetModule(args);\n                }\n            }\n        }\n\n        context = {\n            config: config,\n            contextName: contextName,\n            registry: registry,\n            defined: defined,\n            urlFetched: urlFetched,\n            defQueue: defQueue,\n            Module: Module,\n            makeModuleMap: makeModuleMap,\n            nextTick: req.nextTick,\n            onError: onError,\n\n            /**\n             * Set a configuration for the context.\n             * @param {Object} cfg config object to integrate.\n             */\n            configure: function (cfg) {\n                //Make sure the baseUrl ends in a slash.\n                if (cfg.baseUrl) {\n                    if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {\n                        cfg.baseUrl += '/';\n                    }\n                }\n\n                //Save off the paths and packages since they require special processing,\n                //they are additive.\n                var pkgs = config.pkgs,\n                    shim = config.shim,\n                    objs = {\n                        paths: true,\n                        config: true,\n                        map: true\n                    };\n\n                eachProp(cfg, function (value, prop) {\n                    if (objs[prop]) {\n                        if (prop === 'map') {\n                            if (!config.map) {\n                                config.map = {};\n                            }\n                            mixin(config[prop], value, true, true);\n                        } else {\n                            mixin(config[prop], value, true);\n                        }\n                    } else {\n                        config[prop] = value;\n                    }\n                });\n\n                //Merge shim\n                if (cfg.shim) {\n                    eachProp(cfg.shim, function (value, id) {\n                        //Normalize the structure\n                        if (isArray(value)) {\n                            value = {\n                                deps: value\n                            };\n                        }\n                        if ((value.exports || value.init) && !value.exportsFn) {\n                            value.exportsFn = context.makeShimExports(value);\n                        }\n                        shim[id] = value;\n                    });\n                    config.shim = shim;\n                }\n\n                //Adjust packages if necessary.\n                if (cfg.packages) {\n                    each(cfg.packages, function (pkgObj) {\n                        var location;\n\n                        pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;\n                        location = pkgObj.location;\n\n                        //Create a brand new object on pkgs, since currentPackages can\n                        //be passed in again, and config.pkgs is the internal transformed\n                        //state for all package configs.\n                        pkgs[pkgObj.name] = {\n                            name: pkgObj.name,\n                            location: location || pkgObj.name,\n                            //Remove leading dot in main, so main paths are normalized,\n                            //and remove any trailing .js, since different package\n                            //envs have different conventions: some use a module name,\n                            //some use a file name.\n                            main: (pkgObj.main || 'main')\n                                  .replace(currDirRegExp, '')\n                                  .replace(jsSuffixRegExp, '')\n                        };\n                    });\n\n                    //Done with modifications, assing packages back to context config\n                    config.pkgs = pkgs;\n                }\n\n                //If there are any \"waiting to execute\" modules in the registry,\n                //update the maps for them, since their info, like URLs to load,\n                //may have changed.\n                eachProp(registry, function (mod, id) {\n                    //If module already has init called, since it is too\n                    //late to modify them, and ignore unnormalized ones\n                    //since they are transient.\n                    if (!mod.inited && !mod.map.unnormalized) {\n                        mod.map = makeModuleMap(id);\n                    }\n                });\n\n                //If a deps array or a config callback is specified, then call\n                //require with those args. This is useful when require is defined as a\n                //config object before require.js is loaded.\n                if (cfg.deps || cfg.callback) {\n                    context.require(cfg.deps || [], cfg.callback);\n                }\n            },\n\n            makeShimExports: function (value) {\n                function fn() {\n                    var ret;\n                    if (value.init) {\n                        ret = value.init.apply(global, arguments);\n                    }\n                    return ret || (value.exports && getGlobal(value.exports));\n                }\n                return fn;\n            },\n\n            makeRequire: function (relMap, options) {\n                options = options || {};\n\n                function localRequire(deps, callback, errback) {\n                    var id, map, requireMod;\n\n                    if (options.enableBuildCallback && callback && isFunction(callback)) {\n                        callback.__requireJsBuild = true;\n                    }\n\n                    if (typeof deps === 'string') {\n                        if (isFunction(callback)) {\n                            //Invalid call\n                            return onError(makeError('requireargs', 'Invalid require call'), errback);\n                        }\n\n                        //If require|exports|module are requested, get the\n                        //value for them from the special handlers. Caveat:\n                        //this only works while module is being defined.\n                        if (relMap && hasProp(handlers, deps)) {\n                            return handlers[deps](registry[relMap.id]);\n                        }\n\n                        //Synchronous access to one module. If require.get is\n                        //available (as in the Node adapter), prefer that.\n                        if (req.get) {\n                            return req.get(context, deps, relMap, localRequire);\n                        }\n\n                        //Normalize module name, if it contains . or ..\n                        map = makeModuleMap(deps, relMap, false, true);\n                        id = map.id;\n\n                        if (!hasProp(defined, id)) {\n                            return onError(makeError('notloaded', 'Module name \"' +\n                                        id +\n                                        '\" has not been loaded yet for context: ' +\n                                        contextName +\n                                        (relMap ? '' : '. Use require([])')));\n                        }\n                        return defined[id];\n                    }\n\n                    //Grab defines waiting in the global queue.\n                    intakeDefines();\n\n                    //Mark all the dependencies as needing to be loaded.\n                    context.nextTick(function () {\n                        //Some defines could have been added since the\n                        //require call, collect them.\n                        intakeDefines();\n\n                        requireMod = getModule(makeModuleMap(null, relMap));\n\n                        //Store if map config should be applied to this require\n                        //call for dependencies.\n                        requireMod.skipMap = options.skipMap;\n\n                        requireMod.init(deps, callback, errback, {\n                            enabled: true\n                        });\n\n                        checkLoaded();\n                    });\n\n                    return localRequire;\n                }\n\n                mixin(localRequire, {\n                    isBrowser: isBrowser,\n\n                    /**\n                     * Converts a module name + .extension into an URL path.\n                     * *Requires* the use of a module name. It does not support using\n                     * plain URLs like nameToUrl.\n                     */\n                    toUrl: function (moduleNamePlusExt) {\n                        var ext,\n                            index = moduleNamePlusExt.lastIndexOf('.'),\n                            segment = moduleNamePlusExt.split('/')[0],\n                            isRelative = segment === '.' || segment === '..';\n\n                        //Have a file extension alias, and it is not the\n                        //dots from a relative path.\n                        if (index !== -1 && (!isRelative || index > 1)) {\n                            ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);\n                            moduleNamePlusExt = moduleNamePlusExt.substring(0, index);\n                        }\n\n                        return context.nameToUrl(normalize(moduleNamePlusExt,\n                                                relMap && relMap.id, true), ext,  true);\n                    },\n\n                    defined: function (id) {\n                        return hasProp(defined, makeModuleMap(id, relMap, false, true).id);\n                    },\n\n                    specified: function (id) {\n                        id = makeModuleMap(id, relMap, false, true).id;\n                        return hasProp(defined, id) || hasProp(registry, id);\n                    }\n                });\n\n                //Only allow undef on top level require calls\n                if (!relMap) {\n                    localRequire.undef = function (id) {\n                        //Bind any waiting define() calls to this context,\n                        //fix for #408\n                        takeGlobalQueue();\n\n                        var map = makeModuleMap(id, relMap, true),\n                            mod = getOwn(registry, id);\n\n                        delete defined[id];\n                        delete urlFetched[map.url];\n                        delete undefEvents[id];\n\n                        if (mod) {\n                            //Hold on to listeners in case the\n                            //module will be attempted to be reloaded\n                            //using a different config.\n                            if (mod.events.defined) {\n                                undefEvents[id] = mod.events;\n                            }\n\n                            cleanRegistry(id);\n                        }\n                    };\n                }\n\n                return localRequire;\n            },\n\n            /**\n             * Called to enable a module if it is still in the registry\n             * awaiting enablement. A second arg, parent, the parent module,\n             * is passed in for context, when this method is overriden by\n             * the optimizer. Not shown here to keep code compact.\n             */\n            enable: function (depMap) {\n                var mod = getOwn(registry, depMap.id);\n                if (mod) {\n                    getModule(depMap).enable();\n                }\n            },\n\n            /**\n             * Internal method used by environment adapters to complete a load event.\n             * A load event could be a script load or just a load pass from a synchronous\n             * load call.\n             * @param {String} moduleName the name of the module to potentially complete.\n             */\n            completeLoad: function (moduleName) {\n                var found, args, mod,\n                    shim = getOwn(config.shim, moduleName) || {},\n                    shExports = shim.exports;\n\n                takeGlobalQueue();\n\n                while (defQueue.length) {\n                    args = defQueue.shift();\n                    if (args[0] === null) {\n                        args[0] = moduleName;\n                        //If already found an anonymous module and bound it\n                        //to this name, then this is some other anon module\n                        //waiting for its completeLoad to fire.\n                        if (found) {\n                            break;\n                        }\n                        found = true;\n                    } else if (args[0] === moduleName) {\n                        //Found matching define call for this script!\n                        found = true;\n                    }\n\n                    callGetModule(args);\n                }\n\n                //Do this after the cycle of callGetModule in case the result\n                //of those calls/init calls changes the registry.\n                mod = getOwn(registry, moduleName);\n\n                if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) {\n                    if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {\n                        if (hasPathFallback(moduleName)) {\n                            return;\n                        } else {\n                            return onError(makeError('nodefine',\n                                             'No define call for ' + moduleName,\n                                             null,\n                                             [moduleName]));\n                        }\n                    } else {\n                        //A script that does not call define(), so just simulate\n                        //the call for it.\n                        callGetModule([moduleName, (shim.deps || []), shim.exportsFn]);\n                    }\n                }\n\n                checkLoaded();\n            },\n\n            /**\n             * Converts a module name to a file path. Supports cases where\n             * moduleName may actually be just an URL.\n             * Note that it **does not** call normalize on the moduleName,\n             * it is assumed to have already been normalized. This is an\n             * internal API, not a public one. Use toUrl for the public API.\n             */\n            nameToUrl: function (moduleName, ext, skipExt) {\n                var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,\n                    parentPath;\n\n                //If a colon is in the URL, it indicates a protocol is used and it is just\n                //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)\n                //or ends with .js, then assume the user meant to use an url and not a module id.\n                //The slash is important for protocol-less URLs as well as full paths.\n                if (req.jsExtRegExp.test(moduleName)) {\n                    //Just a plain path, not module name lookup, so just return it.\n                    //Add extension if it is included. This is a bit wonky, only non-.js things pass\n                    //an extension, this method probably needs to be reworked.\n                    url = moduleName + (ext || '');\n                } else {\n                    //A module that needs to be converted to a path.\n                    paths = config.paths;\n                    pkgs = config.pkgs;\n\n                    syms = moduleName.split('/');\n                    //For each module name segment, see if there is a path\n                    //registered for it. Start with most specific name\n                    //and work up from it.\n                    for (i = syms.length; i > 0; i -= 1) {\n                        parentModule = syms.slice(0, i).join('/');\n                        pkg = getOwn(pkgs, parentModule);\n                        parentPath = getOwn(paths, parentModule);\n                        if (parentPath) {\n                            //If an array, it means there are a few choices,\n                            //Choose the one that is desired\n                            if (isArray(parentPath)) {\n                                parentPath = parentPath[0];\n                            }\n                            syms.splice(0, i, parentPath);\n                            break;\n                        } else if (pkg) {\n                            //If module name is just the package name, then looking\n                            //for the main module.\n                            if (moduleName === pkg.name) {\n                                pkgPath = pkg.location + '/' + pkg.main;\n                            } else {\n                                pkgPath = pkg.location;\n                            }\n                            syms.splice(0, i, pkgPath);\n                            break;\n                        }\n                    }\n\n                    //Join the path parts together, then figure out if baseUrl is needed.\n                    url = syms.join('/');\n                    url += (ext || (/\\?/.test(url) || skipExt ? '' : '.js'));\n                    url = (url.charAt(0) === '/' || url.match(/^[\\w\\+\\.\\-]+:/) ? '' : config.baseUrl) + url;\n                }\n\n                return config.urlArgs ? url +\n                                        ((url.indexOf('?') === -1 ? '?' : '&') +\n                                         config.urlArgs) : url;\n            },\n\n            //Delegates to req.load. Broken out as a separate function to\n            //allow overriding in the optimizer.\n            load: function (id, url) {\n                req.load(context, id, url);\n            },\n\n            /**\n             * Executes a module callack function. Broken out as a separate function\n             * solely to allow the build system to sequence the files in the built\n             * layer in the right sequence.\n             *\n             * @private\n             */\n            execCb: function (name, callback, args, exports) {\n                return callback.apply(exports, args);\n            },\n\n            /**\n             * callback for script loads, used to check status of loading.\n             *\n             * @param {Event} evt the event from the browser for the script\n             * that was loaded.\n             */\n            onScriptLoad: function (evt) {\n                //Using currentTarget instead of target for Firefox 2.0's sake. Not\n                //all old browsers will be supported, but this one was easy enough\n                //to support and still makes sense.\n                if (evt.type === 'load' ||\n                        (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {\n                    //Reset interactive script so a script node is not held onto for\n                    //to long.\n                    interactiveScript = null;\n\n                    //Pull out the name of the module and the context.\n                    var data = getScriptData(evt);\n                    context.completeLoad(data.id);\n                }\n            },\n\n            /**\n             * Callback for script errors.\n             */\n            onScriptError: function (evt) {\n                var data = getScriptData(evt);\n                if (!hasPathFallback(data.id)) {\n                    return onError(makeError('scripterror', 'Script error', evt, [data.id]));\n                }\n            }\n        };\n\n        context.require = context.makeRequire();\n        return context;\n    }\n\n    /**\n     * Main entry point.\n     *\n     * If the only argument to require is a string, then the module that\n     * is represented by that string is fetched for the appropriate context.\n     *\n     * If the first argument is an array, then it will be treated as an array\n     * of dependency string names to fetch. An optional function callback can\n     * be specified to execute when all of those dependencies are available.\n     *\n     * Make a local req variable to help Caja compliance (it assumes things\n     * on a require that are not standardized), and to give a short\n     * name for minification/local scope use.\n     */\n    req = requirejs = function (deps, callback, errback, optional) {\n\n        //Find the right context, use default\n        var context, config,\n            contextName = defContextName;\n\n        // Determine if have config object in the call.\n        if (!isArray(deps) && typeof deps !== 'string') {\n            // deps is a config object\n            config = deps;\n            if (isArray(callback)) {\n                // Adjust args if there are dependencies\n                deps = callback;\n                callback = errback;\n                errback = optional;\n            } else {\n                deps = [];\n            }\n        }\n\n        if (config && config.context) {\n            contextName = config.context;\n        }\n\n        context = getOwn(contexts, contextName);\n        if (!context) {\n            context = contexts[contextName] = req.s.newContext(contextName);\n        }\n\n        if (config) {\n            context.configure(config);\n        }\n\n        return context.require(deps, callback, errback);\n    };\n\n    /**\n     * Support require.config() to make it easier to cooperate with other\n     * AMD loaders on globally agreed names.\n     */\n    req.config = function (config) {\n        return req(config);\n    };\n\n    /**\n     * Execute something after the current tick\n     * of the event loop. Override for other envs\n     * that have a better solution than setTimeout.\n     * @param  {Function} fn function to execute later.\n     */\n    req.nextTick = typeof setTimeout !== 'undefined' ? function (fn) {\n        setTimeout(fn, 4);\n    } : function (fn) { fn(); };\n\n    /**\n     * Export require as a global, but only if it does not already exist.\n     */\n    if (!require) {\n        require = req;\n    }\n\n    req.version = version;\n\n    //Used to filter out dependencies that are already paths.\n    req.jsExtRegExp = /^\\/|:|\\?|\\.js$/;\n    req.isBrowser = isBrowser;\n    s = req.s = {\n        contexts: contexts,\n        newContext: newContext\n    };\n\n    //Create default context.\n    req({});\n\n    //Exports some context-sensitive methods on global require.\n    each([\n        'toUrl',\n        'undef',\n        'defined',\n        'specified'\n    ], function (prop) {\n        //Reference from contexts instead of early binding to default context,\n        //so that during builds, the latest instance of the default context\n        //with its config gets used.\n        req[prop] = function () {\n            var ctx = contexts[defContextName];\n            return ctx.require[prop].apply(ctx, arguments);\n        };\n    });\n\n    if (isBrowser) {\n        head = s.head = document.getElementsByTagName('head')[0];\n        //If BASE tag is in play, using appendChild is a problem for IE6.\n        //When that browser dies, this can be removed. Details in this jQuery bug:\n        //http://dev.jquery.com/ticket/2709\n        baseElement = document.getElementsByTagName('base')[0];\n        if (baseElement) {\n            head = s.head = baseElement.parentNode;\n        }\n    }\n\n    /**\n     * Any errors that require explicitly generates will be passed to this\n     * function. Intercept/override it if you want custom error handling.\n     * @param {Error} err the error object.\n     */\n    req.onError = function (err) {\n        throw err;\n    };\n\n    /**\n     * Does the request to load a module for the browser case.\n     * Make this a separate function to allow other environments\n     * to override it.\n     *\n     * @param {Object} context the require context to find state.\n     * @param {String} moduleName the name of the module.\n     * @param {Object} url the URL to the module.\n     */\n    req.load = function (context, moduleName, url) {\n        var config = (context && context.config) || {},\n            node;\n        if (isBrowser) {\n            //In the browser so use a script tag\n            node = config.xhtml ?\n                    document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :\n                    document.createElement('script');\n            node.type = config.scriptType || 'text/javascript';\n            node.charset = 'utf-8';\n            node.async = true;\n\n            node.setAttribute('data-requirecontext', context.contextName);\n            node.setAttribute('data-requiremodule', moduleName);\n\n            //Set up load listener. Test attachEvent first because IE9 has\n            //a subtle issue in its addEventListener and script onload firings\n            //that do not match the behavior of all other browsers with\n            //addEventListener support, which fire the onload event for a\n            //script right after the script execution. See:\n            //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution\n            //UNFORTUNATELY Opera implements attachEvent but does not follow the script\n            //script execution mode.\n            if (node.attachEvent &&\n                    //Check if node.attachEvent is artificially added by custom script or\n                    //natively supported by browser\n                    //read https://github.com/jrburke/requirejs/issues/187\n                    //if we can NOT find [native code] then it must NOT natively supported.\n                    //in IE8, node.attachEvent does not have toString()\n                    //Note the test for \"[native code\" with no closing brace, see:\n                    //https://github.com/jrburke/requirejs/issues/273\n                    !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&\n                    !isOpera) {\n                //Probably IE. IE (at least 6-8) do not fire\n                //script onload right after executing the script, so\n                //we cannot tie the anonymous define call to a name.\n                //However, IE reports the script as being in 'interactive'\n                //readyState at the time of the define call.\n                useInteractive = true;\n\n                node.attachEvent('onreadystatechange', context.onScriptLoad);\n                //It would be great to add an error handler here to catch\n                //404s in IE9+. However, onreadystatechange will fire before\n                //the error handler, so that does not help. If addEventListener\n                //is used, then IE will fire error before load, but we cannot\n                //use that pathway given the connect.microsoft.com issue\n                //mentioned above about not doing the 'script execute,\n                //then fire the script load event listener before execute\n                //next script' that other browsers do.\n                //Best hope: IE10 fixes the issues,\n                //and then destroys all installs of IE 6-9.\n                //node.attachEvent('onerror', context.onScriptError);\n            } else {\n                node.addEventListener('load', context.onScriptLoad, false);\n                node.addEventListener('error', context.onScriptError, false);\n            }\n            node.src = url;\n\n            //For some cache cases in IE 6-8, the script executes before the end\n            //of the appendChild execution, so to tie an anonymous define\n            //call to the module name (which is stored on the node), hold on\n            //to a reference to this node, but clear after the DOM insertion.\n            currentlyAddingScript = node;\n            if (baseElement) {\n                head.insertBefore(node, baseElement);\n            } else {\n                head.appendChild(node);\n            }\n            currentlyAddingScript = null;\n\n            return node;\n        } else if (isWebWorker) {\n            try {\n                //In a web worker, use importScripts. This is not a very\n                //efficient use of importScripts, importScripts will block until\n                //its script is downloaded and evaluated. However, if web workers\n                //are in play, the expectation that a build has been done so that\n                //only one script needs to be loaded anyway. This may need to be\n                //reevaluated if other use cases become common.\n                importScripts(url);\n\n                //Account for anonymous modules\n                context.completeLoad(moduleName);\n            } catch (e) {\n                context.onError(makeError('importscripts',\n                                'importScripts failed for ' +\n                                    moduleName + ' at ' + url,\n                                e,\n                                [moduleName]));\n            }\n        }\n    };\n\n    function getInteractiveScript() {\n        if (interactiveScript && interactiveScript.readyState === 'interactive') {\n            return interactiveScript;\n        }\n\n        eachReverse(scripts(), function (script) {\n            if (script.readyState === 'interactive') {\n                return (interactiveScript = script);\n            }\n        });\n        return interactiveScript;\n    }\n\n    //Look for a data-main script attribute, which could also adjust the baseUrl.\n    if (isBrowser) {\n        //Figure out baseUrl. Get it from the script tag with require.js in it.\n        eachReverse(scripts(), function (script) {\n            //Set the 'head' where we can append children by\n            //using the script's parent.\n            if (!head) {\n                head = script.parentNode;\n            }\n\n            //Look for a data-main attribute to set main script for the page\n            //to load. If it is there, the path to data main becomes the\n            //baseUrl, if it is not already set.\n            dataMain = script.getAttribute('data-main');\n            if (dataMain) {\n                //Set final baseUrl if there is not already an explicit one.\n                if (!cfg.baseUrl) {\n                    //Pull off the directory of data-main for use as the\n                    //baseUrl.\n                    src = dataMain.split('/');\n                    mainScript = src.pop();\n                    subPath = src.length ? src.join('/')  + '/' : './';\n\n                    cfg.baseUrl = subPath;\n                    dataMain = mainScript;\n                }\n\n                //Strip off any trailing .js since dataMain is now\n                //like a module name.\n                dataMain = dataMain.replace(jsSuffixRegExp, '');\n\n                //Put the data-main script in the files to load.\n                cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];\n\n                return true;\n            }\n        });\n    }\n\n    /**\n     * The function that handles definitions of modules. Differs from\n     * require() in that a string for the module should be the first argument,\n     * and the function to execute after dependencies are loaded should\n     * return a value to define the module corresponding to the first argument's\n     * name.\n     */\n    define = function (name, deps, callback) {\n        var node, context;\n\n        //Allow for anonymous modules\n        if (typeof name !== 'string') {\n            //Adjust args appropriately\n            callback = deps;\n            deps = name;\n            name = null;\n        }\n\n        //This module may not have dependencies\n        if (!isArray(deps)) {\n            callback = deps;\n            deps = [];\n        }\n\n        //If no name, and callback is a function, then figure out if it a\n        //CommonJS thing with dependencies.\n        if (!deps.length && isFunction(callback)) {\n            //Remove comments from the callback string,\n            //look for require calls, and pull them into the dependencies,\n            //but only if there are function args.\n            if (callback.length) {\n                callback\n                    .toString()\n                    .replace(commentRegExp, '')\n                    .replace(cjsRequireRegExp, function (match, dep) {\n                        deps.push(dep);\n                    });\n\n                //May be a CommonJS thing even without require calls, but still\n                //could use exports, and module. Avoid doing exports and module\n                //work though if it just needs require.\n                //REQUIRES the function to expect the CommonJS variables in the\n                //order listed below.\n                deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);\n            }\n        }\n\n        //If in IE 6-8 and hit an anonymous define() call, do the interactive\n        //work.\n        if (useInteractive) {\n            node = currentlyAddingScript || getInteractiveScript();\n            if (node) {\n                if (!name) {\n                    name = node.getAttribute('data-requiremodule');\n                }\n                context = contexts[node.getAttribute('data-requirecontext')];\n            }\n        }\n\n        //Always save off evaluating the def call until the script onload handler.\n        //This allows multiple modules to be in a file without prematurely\n        //tracing dependencies, and allows for anonymous module support,\n        //where the module name is not known until the script onload event\n        //occurs. If no context, use the global queue, and get it processed\n        //in the onscript load callback.\n        (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n\n\n    /**\n     * Executes the text. Normally just uses eval, but can be modified\n     * to use a better, environment-specific call. Only used for transpiling\n     * loader plugins, not for plain JS modules.\n     * @param {String} text the text to execute/evaluate.\n     */\n    req.exec = function (text) {\n        /*jslint evil: true */\n        return eval(text);\n    };\n\n    //Set up with config info.\n    req(cfg);\n}(this));\n"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/snap.svg-min.js",
    "content": "// Snap.svg 0.2.0\n// \n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// \n// build: 2014-01-23\n!function(a){var b,c,d=\"0.4.2\",e=\"hasOwnProperty\",f=/[\\.\\/]/,g=\"*\",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)\"zIndex\"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],\"zIndex\"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),\"function\"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp(\"(?:\\\\.|\\\\/|^)\"+a+\"(?:\\\\.|\\\\/|$)\").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return void(k._events=j={n:{}});var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return\"You are running Eve \"+d},\"undefined\"!=typeof module&&module.exports?module.exports=k:\"undefined\"!=typeof define?define(\"eve\",[],function(){return k}):a.eve=k}(this),function(a,b){\"function\"==typeof define&&define.amd?define([\"eve\"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){var c=function(b){var c={},d=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},e=Array.isArray||function(a){return a instanceof Array||\"[object Array]\"==Object.prototype.toString.call(a)},f=0,g=\"M\"+(+new Date).toString(36),h=function(){return g+(f++).toString(36)},i=Date.now||function(){return+new Date},j=function(a){var b=this;if(null==a)return b.s;var c=b.s-a;b.b+=b.dur*c,b.B+=b.dur*c,b.s=a},k=function(a){var b=this;return null==a?b.spd:void(b.spd=a)},l=function(a){var b=this;return null==a?b.dur:(b.s=b.s*a/b.dur,void(b.dur=a))},m=function(){var a=this;delete c[a.id],b(\"mina.stop.\"+a.id,a)},n=function(){var a=this;a.pdif||(delete c[a.id],a.pdif=a.get()-a.b)},o=function(){var a=this;a.pdif&&(a.b=a.get()-a.pdif,delete a.pdif,c[a.id]=a)},p=function(){var a=0;for(var f in c)if(c.hasOwnProperty(f)){var g,h=c[f],i=h.get();if(a++,h.s=(i-h.b)/(h.dur/h.spd),h.s>=1&&(delete c[f],h.s=1,a--,function(a){setTimeout(function(){b(\"mina.finish.\"+a.id,a)})}(h)),e(h.start)){g=[];for(var j=0,k=h.start.length;k>j;j++)g[j]=+h.start[j]+(h.end[j]-h.start[j])*h.easing(h.s)}else g=+h.start+(h.end-h.start)*h.easing(h.s);h.set(g)}a&&d(p)},q=function(a,b,e,f,g,i,r){var s={id:h(),start:a,end:b,b:e,s:0,dur:f-e,spd:1,get:g,set:i,easing:r||q.linear,status:j,speed:k,duration:l,stop:m,pause:n,resume:o};c[s.id]=s;var t,u=0;for(t in c)if(c.hasOwnProperty(t)&&(u++,2==u))break;return 1==u&&d(p),s};return q.time=i,q.getById=function(a){return c[a]||null},q.linear=function(a){return a},q.easeout=function(a){return Math.pow(a,1.7)},q.easein=function(a){return Math.pow(a,.48)},q.easeinout=function(a){if(1==a)return 1;if(0==a)return 0;var b=.48-a/1.04,c=Math.sqrt(.1734+b*b),d=c-b,e=Math.pow(Math.abs(d),1/3)*(0>d?-1:1),f=-c-b,g=Math.pow(Math.abs(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},q.backin=function(a){if(1==a)return 1;var b=1.70158;return a*a*((b+1)*a-b)},q.backout=function(a){if(0==a)return 0;a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},q.elastic=function(a){return a==!!a?a:Math.pow(2,-10*a)*Math.sin(2*(a-.075)*Math.PI/.3)+1},q.bounce=function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b},a.mina=q,q}(\"undefined\"==typeof b?function(){}:b),d=function(){function d(a,b){if(a){if(a.tagName)return z(a);if(a instanceof u)return a;if(null==b)return a=I.doc.querySelector(a),z(a)}return a=null==a?\"100%\":a,b=null==b?\"100%\":b,new y(a,b)}function e(a,b){if(b){if(\"string\"==typeof a&&(a=e(a)),\"string\"==typeof b)return\"xlink:\"==b.substring(0,6)?a.getAttributeNS(fb,b.substring(6)):\"xml:\"==b.substring(0,4)?a.getAttributeNS(gb,b.substring(4)):a.getAttribute(b);for(var c in b)if(b[J](c)){var d=K(b[c]);d?\"xlink:\"==c.substring(0,6)?a.setAttributeNS(fb,c.substring(6),d):\"xml:\"==c.substring(0,4)?a.setAttributeNS(gb,c.substring(4),d):a.setAttribute(c,d):a.removeAttribute(c)}}else a=I.doc.createElementNS(gb,a);return a}function f(a,b){return b=K.prototype.toLowerCase.call(b),\"finite\"==b?isFinite(a):\"array\"==b&&(a instanceof Array||Array.isArray&&Array.isArray(a))?!0:\"null\"==b&&null===a||b==typeof a&&null!==a||\"object\"==b&&a===Object(a)||U.call(a).slice(8,-1).toLowerCase()==b}function h(a){if(\"function\"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[J](c)&&(b[c]=h(a[c]));return b}function i(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function j(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join(\"␀\"),g=d.cache=d.cache||{},h=d.count=d.count||[];return g[J](f)?(i(h,f),c?c(g[f]):g[f]):(h.length>=1e3&&delete g[h.shift()],h.push(f),g[f]=a.apply(b,e),c?c(g[f]):g[f])}return d}function k(a,b,c,d,e,f){if(null==e){var g=a-c,h=b-d;return g||h?(180+180*N.atan2(-h,-g)/R+360)%360:0}return k(a,b,e,f)-k(c,d,e,f)}function l(a){return a%360*R/180}function m(a){return 180*a/R%360}function n(a,b,c,d,e,f){return null==b&&\"[object SVGMatrix]\"==U.call(a)?(this.a=a.a,this.b=a.b,this.c=a.c,this.d=a.d,this.e=a.e,void(this.f=a.f)):void(null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0))}function o(a){var b=[];return a=a.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g,function(a,c,d){return d=d.split(/\\s*,\\s*|\\s+/),\"rotate\"==c&&1==d.length&&d.push(0,0),\"scale\"==c&&(2==d.length&&d.push(0,0),1==d.length&&d.push(d[0],0,0)),b.push(\"skewX\"==c?[\"m\",1,0,N.tan(l(d[0])),1,0,0]:\"skewY\"==c?[\"m\",1,N.tan(l(d[0])),0,1,0,0]:[c.charAt(0)].concat(d)),a}),b}function p(a,b){var c=qb(a),d=new n;if(c)for(var e=0,f=c.length;f>e;e++){var g,h,i,j,k,l=c[e],m=l.length,o=K(l[0]).toLowerCase(),p=l[0]!=o,q=p?d.invert():0;\"t\"==o&&2==m?d.translate(l[1],0):\"t\"==o&&3==m?p?(g=q.x(0,0),h=q.y(0,0),i=q.x(l[1],l[2]),j=q.y(l[1],l[2]),d.translate(i-g,j-h)):d.translate(l[1],l[2]):\"r\"==o?2==m?(k=k||b,d.rotate(l[1],k.x+k.width/2,k.y+k.height/2)):4==m&&(p?(i=q.x(l[2],l[3]),j=q.y(l[2],l[3]),d.rotate(l[1],i,j)):d.rotate(l[1],l[2],l[3])):\"s\"==o?2==m||3==m?(k=k||b,d.scale(l[1],l[m-1],k.x+k.width/2,k.y+k.height/2)):4==m?p?(i=q.x(l[2],l[3]),j=q.y(l[2],l[3]),d.scale(l[1],l[1],i,j)):d.scale(l[1],l[1],l[2],l[3]):5==m&&(p?(i=q.x(l[3],l[4]),j=q.y(l[3],l[4]),d.scale(l[1],l[2],i,j)):d.scale(l[1],l[2],l[3],l[4])):\"m\"==o&&7==m&&d.add(l[1],l[2],l[3],l[4],l[5],l[6])}return d}function q(a,b){if(null==b){var c=!0;if(b=a.node.getAttribute(\"linearGradient\"==a.type||\"radialGradient\"==a.type?\"gradientTransform\":\"pattern\"==a.type?\"patternTransform\":\"transform\"),!b)return new n;b=o(b)}else b=d._.rgTransform.test(b)?K(b).replace(/\\.{3}|…/g,a._.transform||S):o(b),f(b,\"array\")&&(b=d.path?d.path.toString.call(b):K(b)),a._.transform=b;var e=p(b,a.getBBox(1));return c?e:void(a.matrix=e)}function r(a){var b=d._.someDefs;if(b&&rb(b.ownerDocument.documentElement,b))return b;var c=a.node.ownerSVGElement&&z(a.node.ownerSVGElement)||a.node.parentNode&&z(a.node.parentNode)||d.select(\"svg\")||d(0,0),e=c.select(\"defs\"),f=null==e?!1:e.node;return f||(f=x(\"defs\",c.node).node),d._.someDefs=f,f}function s(a,b,c){function d(a){return null==a?S:a==+a?a:(e(j,{width:a}),j.getBBox().width)}function f(a){return null==a?S:a==+a?a:(e(j,{height:a}),j.getBBox().height)}function g(d,e){null==b?i[d]=e(a.attr(d)):d==b&&(i=e(null==c?a.attr(d):c))}var h=r(a),i={},j=h.querySelector(\".svg---mgr\");switch(j||(j=e(\"rect\"),e(j,{width:10,height:10,\"class\":\"svg---mgr\"}),h.appendChild(j)),a.type){case\"rect\":g(\"rx\",d),g(\"ry\",f);case\"image\":g(\"width\",d),g(\"height\",f);case\"text\":g(\"x\",d),g(\"y\",f);break;case\"circle\":g(\"cx\",d),g(\"cy\",f),g(\"r\",d);break;case\"ellipse\":g(\"cx\",d),g(\"cy\",f),g(\"rx\",d),g(\"ry\",f);break;case\"line\":g(\"x1\",d),g(\"x2\",d),g(\"y1\",f),g(\"y2\",f);break;case\"marker\":g(\"refX\",d),g(\"markerWidth\",d),g(\"refY\",f),g(\"markerHeight\",f);break;case\"radialGradient\":g(\"fx\",d),g(\"fy\",f);break;case\"tspan\":g(\"dx\",d),g(\"dy\",f);break;default:g(b,d)}return i}function t(a){f(a,\"array\")||(a=Array.prototype.slice.call(arguments,0));for(var b=0,c=0,d=this.node;this[b];)delete this[b++];for(b=0;b<a.length;b++)\"set\"==a[b].type?a[b].forEach(function(a){d.appendChild(a.node)}):d.appendChild(a[b].node);var e=d.childNodes;for(b=0;b<e.length;b++)this[c++]=z(e[b]);return this}function u(a){if(a.snap in hb)return hb[a.snap];var b,c=this.id=eb();try{b=a.ownerSVGElement}catch(d){}if(this.node=a,b&&(this.paper=new y(b)),this.type=a.tagName,this.anims={},this._={transform:[]},a.snap=c,hb[c]=this,\"g\"==this.type){this.add=t;for(var e in y.prototype)y.prototype[J](e)&&(this[e]=y.prototype[e])}}function v(a){for(var b,c=0,d=a.length;d>c;c++)if(b=b||a[c])return b}function w(a){this.node=a}function x(a,b){var c=e(a);b.appendChild(c);var d=z(c);return d.type=a,d}function y(a,b){var c,d,f,g=y.prototype;if(a&&\"svg\"==a.tagName){if(a.snap in hb)return hb[a.snap];c=new u(a),d=a.getElementsByTagName(\"desc\")[0],f=a.getElementsByTagName(\"defs\")[0],d||(d=e(\"desc\"),d.appendChild(I.doc.createTextNode(\"Created with Snap\")),c.node.appendChild(d)),f||(f=e(\"defs\"),c.node.appendChild(f)),c.defs=f;for(var h in g)g[J](h)&&(c[h]=g[h]);c.paper=c.root=c}else c=x(\"svg\",I.doc.body),e(c.node,{height:b,version:1.1,width:a,xmlns:gb});return c}function z(a){return a?a instanceof u||a instanceof w?a:\"svg\"==a.tagName?new y(a):new u(a):a}function A(){return this.selectAll(\"stop\")}function B(a,b){var c=e(\"stop\"),f={offset:+b+\"%\"};return a=d.color(a),f[\"stop-color\"]=a.hex,a.opacity<1&&(f[\"stop-opacity\"]=a.opacity),e(c,f),this.node.appendChild(c),this}function C(){if(\"linearGradient\"==this.type){var a=e(this.node,\"x1\")||0,b=e(this.node,\"x2\")||1,c=e(this.node,\"y1\")||0,f=e(this.node,\"y2\")||0;return d._.box(a,c,N.abs(b-a),N.abs(f-c))}var g=this.node.cx||.5,h=this.node.cy||.5,i=this.node.r||0;return d._.box(g-i,h-i,2*i,2*i)}function D(a,c){function d(a,b){for(var c=(b-j)/(a-k),d=k;a>d;d++)h[d].offset=+(+j+c*(d-k)).toFixed(2);k=a,j=b}var f,g=v(b(\"snap.util.grad.parse\",null,c));if(!g)return null;g.params.unshift(a),f=\"l\"==g.type.toLowerCase()?E.apply(0,g.params):F.apply(0,g.params),g.type!=g.type.toLowerCase()&&e(f.node,{gradientUnits:\"userSpaceOnUse\"});var h=g.stops,i=h.length,j=0,k=0;i--;for(var l=0;i>l;l++)\"offset\"in h[l]&&d(l,h[l].offset);for(h[i].offset=h[i].offset||100,d(i,h[i].offset),l=0;i>=l;l++){var m=h[l];f.addStop(m.color,m.offset)}return f}function E(a,b,c,d,f){var g=x(\"linearGradient\",a);return g.stops=A,g.addStop=B,g.getBBox=C,null!=b&&e(g.node,{x1:b,y1:c,x2:d,y2:f}),g}function F(a,b,c,d,f,g){var h=x(\"radialGradient\",a);return h.stops=A,h.addStop=B,h.getBBox=C,null!=b&&e(h.node,{cx:b,cy:c,r:d}),null!=f&&null!=g&&e(h.node,{fx:f,fy:g}),h}function G(a){return function(c){if(b.stop(),c instanceof w&&1==c.node.childNodes.length&&(\"radialGradient\"==c.node.firstChild.tagName||\"linearGradient\"==c.node.firstChild.tagName||\"pattern\"==c.node.firstChild.tagName)&&(c=c.node.firstChild,r(this).appendChild(c),c=z(c)),c instanceof u)if(\"radialGradient\"==c.type||\"linearGradient\"==c.type||\"pattern\"==c.type){c.node.id||e(c.node,{id:c.id});var f=ib(c.node.id)}else f=c.attr(a);else if(f=d.color(c),f.error){var g=D(r(this),c);g?(g.node.id||e(g.node,{id:g.id}),f=ib(g.node.id)):f=c}else f=K(f);var h={};h[a]=f,e(this.node,h),this.node.style[a]=S}}function H(a){for(var b=[],c=a.childNodes,d=0,e=c.length;e>d;d++){var f=c[d];3==f.nodeType&&b.push(f.nodeValue),\"tspan\"==f.tagName&&b.push(1==f.childNodes.length&&3==f.firstChild.nodeType?f.firstChild.nodeValue:H(f))}return b}d.version=\"0.2.0\",d.toString=function(){return\"Snap v\"+this.version},d._={};var I={win:a,doc:a.document};d._.glob=I;var J=\"hasOwnProperty\",K=String,L=parseFloat,M=parseInt,N=Math,O=N.max,P=N.min,Q=N.abs,R=(N.pow,N.PI),S=(N.round,\"\"),T=\" \",U=Object.prototype.toString,V=/^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|°|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|°|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,W=/^url\\(#?([^)]+)\\)$/,X=\"\t\\n\u000b\\f\\r   ᠎             　\\u2028\\u2029\",Y=new RegExp(\"[,\"+X+\"]+\"),Z=(new RegExp(\"[\"+X+\"]\",\"g\"),new RegExp(\"[\"+X+\"]*,[\"+X+\"]*\")),$={hs:1,rg:1},_=new RegExp(\"([a-z])[\"+X+\",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\"+X+\"]*,?[\"+X+\"]*)+)\",\"ig\"),ab=new RegExp(\"([rstm])[\"+X+\",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\"+X+\"]*,?[\"+X+\"]*)+)\",\"ig\"),bb=new RegExp(\"(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\"+X+\"]*,?[\"+X+\"]*\",\"ig\"),cb=0,db=\"S\"+(+new Date).toString(36),eb=function(){return db+(cb++).toString(36)},fb=\"http://www.w3.org/1999/xlink\",gb=\"http://www.w3.org/2000/svg\",hb={},ib=d.url=function(a){return\"url('#\"+a+\"')\"};d._.$=e,d._.id=eb,d.format=function(){var a=/\\{([^\\}]+)\\}/g,b=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),\"function\"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+\"\"};return function(b,d){return K(b).replace(a,function(a,b){return c(a,b,d)})}}();var jb=function(){function a(){this.parentNode.removeChild(this)}return function(b,c){var d=I.doc.createElement(\"img\"),e=I.doc.body;d.style.cssText=\"position:absolute;left:-9999em;top:-9999em\",d.onload=function(){c.call(d),d.onload=d.onerror=null,e.removeChild(d)},d.onerror=a,e.appendChild(d),d.src=b}}();d._.clone=h,d._.cacher=j,d.rad=l,d.deg=m,d.angle=k,d.is=f,d.snapTo=function(a,b,c){if(c=f(c,\"finite\")?c:10,f(a,\"array\")){for(var d=a.length;d--;)if(Q(a[d]-b)<=c)return a[d]}else{a=+a;var e=b%a;if(c>e)return b-e;if(e>a-c)return b-e+a}return b},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function c(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof n&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}return this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2],this},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new n(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new n(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){return this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){return null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d),this},a.rotate=function(a,b,c){a=l(a),b=b||0,c=c||0;var d=+N.cos(a).toFixed(9),e=+N.sin(a).toFixed(9);return this.add(d,e,-e,d,b,c),this.add(1,0,0,1,-b,-c)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[K.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return\"matrix(\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+\")\"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var d=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(d[0])),c(d[0]),a.shear=d[0][0]*d[1][0]+d[0][1]*d[1][1],d[1]=[d[1][0]-d[0][0]*a.shear,d[1][1]-d[0][1]*a.shear],a.scaley=N.sqrt(b(d[1])),c(d[1]),a.shear/=a.scaley;var e=-d[0][1],f=d[1][1];return 0>f?(a.rotate=m(N.acos(f)),0>e&&(a.rotate=360-a.rotate)):a.rotate=m(N.asin(e)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this.split();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?\"t\"+[+b.dx.toFixed(4),+b.dy.toFixed(4)]:S)+(1!=b.scalex||1!=b.scaley?\"s\"+[b.scalex,b.scaley,0,0]:S)+(b.rotate?\"r\"+[+b.rotate.toFixed(4),0,0]:S)):\"m\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(n.prototype),d.Matrix=n,d.getRGB=j(function(a){if(!a||(a=K(a)).indexOf(\"-\")+1)return{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:nb};if(\"none\"==a)return{r:-1,g:-1,b:-1,hex:\"none\",toString:nb};if(!($[J](a.toLowerCase().substring(0,2))||\"#\"==a.charAt())&&(a=kb(a)),!a)return{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:nb};var b,c,e,g,h,i,j=a.match(V);return j?(j[2]&&(e=M(j[2].substring(5),16),c=M(j[2].substring(3,5),16),b=M(j[2].substring(1,3),16)),j[3]&&(e=M((h=j[3].charAt(3))+h,16),c=M((h=j[3].charAt(2))+h,16),b=M((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4].split(Z),b=L(i[0]),\"%\"==i[0].slice(-1)&&(b*=2.55),c=L(i[1]),\"%\"==i[1].slice(-1)&&(c*=2.55),e=L(i[2]),\"%\"==i[2].slice(-1)&&(e*=2.55),\"rgba\"==j[1].toLowerCase().slice(0,4)&&(g=L(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5].split(Z),b=L(i[0]),\"%\"==i[0].slice(-1)&&(b/=100),c=L(i[1]),\"%\"==i[1].slice(-1)&&(c/=100),e=L(i[2]),\"%\"==i[2].slice(-1)&&(e/=100),(\"deg\"==i[0].slice(-3)||\"°\"==i[0].slice(-1))&&(b/=360),\"hsba\"==j[1].toLowerCase().slice(0,4)&&(g=L(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(g/=100),d.hsb2rgb(b,c,e,g)):j[6]?(i=j[6].split(Z),b=L(i[0]),\"%\"==i[0].slice(-1)&&(b/=100),c=L(i[1]),\"%\"==i[1].slice(-1)&&(c/=100),e=L(i[2]),\"%\"==i[2].slice(-1)&&(e/=100),(\"deg\"==i[0].slice(-3)||\"°\"==i[0].slice(-1))&&(b/=360),\"hsla\"==j[1].toLowerCase().slice(0,4)&&(g=L(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(g/=100),d.hsl2rgb(b,c,e,g)):(b=P(N.round(b),255),c=P(N.round(c),255),e=P(N.round(e),255),g=P(O(g,0),1),j={r:b,g:c,b:e,toString:nb},j.hex=\"#\"+(16777216|e|c<<8|b<<16).toString(16).slice(1),j.opacity=f(g,\"finite\")?g:1,j)):{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:nb}},d),d.hsb=j(function(a,b,c){return d.hsb2rgb(a,b,c).hex}),d.hsl=j(function(a,b,c){return d.hsl2rgb(a,b,c).hex}),d.rgb=j(function(a,b,c,d){if(f(d,\"finite\")){var e=N.round;return\"rgba(\"+[e(a),e(b),e(c),+d.toFixed(2)]+\")\"}return\"#\"+(16777216|c|b<<8|a<<16).toString(16).slice(1)});var kb=function(a){var b=I.doc.getElementsByTagName(\"head\")[0],c=\"rgb(255, 0, 0)\";return(kb=j(function(a){if(\"red\"==a.toLowerCase())return c;b.style.color=c,b.style.color=a;var d=I.doc.defaultView.getComputedStyle(b,S).getPropertyValue(\"color\");return d==c?null:d}))(a)},lb=function(){return\"hsb(\"+[this.h,this.s,this.b]+\")\"},mb=function(){return\"hsl(\"+[this.h,this.s,this.l]+\")\"},nb=function(){return 1==this.opacity||null==this.opacity?this.hex:\"rgba(\"+[this.r,this.g,this.b,this.opacity]+\")\"},ob=function(a,b,c){if(null==b&&f(a,\"object\")&&\"r\"in a&&\"g\"in a&&\"b\"in a&&(c=a.b,b=a.g,a=a.r),null==b&&f(a,string)){var e=d.getRGB(a);a=e.r,b=e.g,c=e.b}return(a>1||b>1||c>1)&&(a/=255,b/=255,c/=255),[a,b,c]},pb=function(a,b,c,e){a=N.round(255*a),b=N.round(255*b),c=N.round(255*c);var g={r:a,g:b,b:c,opacity:f(e,\"finite\")?e:1,hex:d.rgb(a,b,c),toString:nb};return f(e,\"finite\")&&(g.opacity=e),g};d.color=function(a){var b;return f(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"b\"in a?(b=d.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):f(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"l\"in a?(b=d.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):(f(a,\"string\")&&(a=d.getRGB(a)),f(a,\"object\")&&\"r\"in a&&\"g\"in a&&\"b\"in a&&!(\"error\"in a)?(b=d.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=d.rgb2hsb(a),a.v=b.b):(a={hex:\"none\"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1,a.error=1)),a.toString=nb,a},d.hsb2rgb=function(a,b,c,d){f(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"b\"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,g,h,i,j;return a=a%360/60,j=c*b,i=j*(1-Q(a%2-1)),e=g=h=c-j,a=~~a,e+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],pb(e,g,h,d)},d.hsl2rgb=function(a,b,c,d){f(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"l\"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,g,h,i,j;return a=a%360/60,j=2*b*(.5>c?c:1-c),i=j*(1-Q(a%2-1)),e=g=h=c-j/2,a=~~a,e+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],pb(e,g,h,d)},d.rgb2hsb=function(a,b,c){c=ob(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:lb}},d.rgb2hsl=function(a,b,c){c=ob(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:mb}},d.parsePathString=function(a){if(!a)return null;var b=d.path(a);if(b.arr)return d.path.clone(b.arr);var c={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},e=[];return f(a,\"array\")&&f(a[0],\"array\")&&(e=d.path.clone(a)),e.length||K(a).replace(_,function(a,b,d){var f=[],g=b.toLowerCase();if(d.replace(bb,function(a,b){b&&f.push(+b)}),\"m\"==g&&f.length>2&&(e.push([b].concat(f.splice(0,2))),g=\"l\",b=\"m\"==b?\"l\":\"L\"),\"o\"==g&&1==f.length&&e.push([b,f[0]]),\"r\"==g)e.push([b].concat(f));else for(;f.length>=c[g]&&(e.push([b].concat(f.splice(0,c[g]))),c[g]););}),e.toString=d.path.toString,b.arr=d.path.clone(e),e};var qb=d.parseTransformString=function(a){if(!a)return null;var b=[];return f(a,\"array\")&&f(a[0],\"array\")&&(b=d.path.clone(a)),b.length||K(a).replace(ab,function(a,c,d){{var e=[];c.toLowerCase()}d.replace(bb,function(a,b){b&&e.push(+b)}),b.push([c].concat(e))}),b.toString=d.path.toString,b};d._.svgTransform2string=o,d._.rgTransform=new RegExp(\"^[a-z][\"+X+\"]*-?\\\\.?\\\\d\",\"i\"),d._.transform2matrix=p,d._unit2px=s;var rb=I.doc.contains||I.doc.compareDocumentPosition?function(a,b){var c=9==a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a==d||!(!d||1!=d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b;)if(b=b.parentNode,b==a)return!0;return!1};d._.getSomeDefs=r,d.select=function(a){return z(I.doc.querySelector(a))},d.selectAll=function(a){for(var b=I.doc.querySelectorAll(a),c=(d.set||Array)(),e=0;e<b.length;e++)c.push(z(b[e]));return c},function(a){function g(a){function b(a,b){var c=e(a.node,b);c=c&&c.match(g),c=c&&c[2],c&&\"#\"==c.charAt()&&(c=c.substring(1),c&&(i[c]=(i[c]||[]).concat(function(c){var d={};d[b]=ib(c),e(a.node,d)})))}function c(a){var b=e(a.node,\"xlink:href\");b&&\"#\"==b.charAt()&&(b=b.substring(1),b&&(i[b]=(i[b]||[]).concat(function(b){a.attr(\"xlink:href\",\"#\"+b)})))}for(var d,f=a.selectAll(\"*\"),g=/^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,h=[],i={},j=0,k=f.length;k>j;j++){d=f[j],b(d,\"fill\"),b(d,\"stroke\"),b(d,\"filter\"),b(d,\"mask\"),b(d,\"clip-path\"),c(d);var l=e(d.node,\"id\");l&&(e(d.node,{id:d.id}),h.push({old:l,id:d.id}))}for(j=0,k=h.length;k>j;j++){var m=i[h[j].old];if(m)for(var n=0,o=m.length;o>n;n++)m[n](h[j].id)}}function h(a,b,c){return function(d){var e=d.slice(a,b);return 1==e.length&&(e=e[0]),c?c(e):e}}function i(a){return function(){var b=a?\"<\"+this.type:\"\",c=this.node.attributes,d=this.node.childNodes;if(a)for(var e=0,f=c.length;f>e;e++)b+=\" \"+c[e].name+'=\"'+c[e].value.replace(/\"/g,'\\\\\"')+'\"';if(d.length){for(a&&(b+=\">\"),e=0,f=d.length;f>e;e++)3==d[e].nodeType?b+=d[e].nodeValue:1==d[e].nodeType&&(b+=z(d[e]).toString());a&&(b+=\"</\"+this.type+\">\")}else a&&(b+=\"/>\");return b}}a.attr=function(a,c){{var d=this;d.node}if(!a)return d;if(f(a,\"string\")){if(!(arguments.length>1))return v(b(\"snap.util.getattr.\"+a,d));var e={};e[a]=c,a=e}for(var g in a)a[J](g)&&b(\"snap.util.attr.\"+g,d,a[g]);return d},a.getBBox=function(a){var b=this;if(\"use\"==b.type&&(b=b.original),b.removed)return{};var c=b._;return a?(c.bboxwt=d.path.get[b.type]?d.path.getBBox(b.realPath=d.path.get[b.type](b)):d._.box(b.node.getBBox()),d._.box(c.bboxwt)):(b.realPath=(d.path.get[b.type]||d.path.get.deflt)(b),c.bbox=d.path.getBBox(d.path.map(b.realPath,b.matrix)),d._.box(c.bbox))};var j=function(){return this.string};a.transform=function(a){var b=this._;if(null==a){var c=new n(this.node.getCTM()),d=q(this),f=d.toTransformString(),g=K(d)==K(this.matrix)?b.transform:f;return{string:g,globalMatrix:c,localMatrix:d,diffMatrix:c.clone().add(d.invert()),global:c.toTransformString(),local:f,toString:j}}return a instanceof n&&(a=a.toTransformString()),q(this,a),this.node&&(\"linearGradient\"==this.type||\"radialGradient\"==this.type?e(this.node,{gradientTransform:this.matrix}):\"pattern\"==this.type?e(this.node,{patternTransform:this.matrix}):e(this.node,{transform:this.matrix})),this},a.parent=function(){return z(this.node.parentNode)},a.append=a.add=function(a){if(a){if(\"set\"==a.type){var b=this;return a.forEach(function(a){b.add(a)}),this}a=z(a),this.node.appendChild(a.node),a.paper=this.paper}return this},a.appendTo=function(a){return a&&(a=z(a),a.append(this)),this},a.prepend=function(a){if(a){a=z(a);var b=a.parent();this.node.insertBefore(a.node,this.node.firstChild),this.add&&this.add(),a.paper=this.paper,this.parent()&&this.parent().add(),b&&b.add()}return this},a.prependTo=function(a){return a=z(a),a.prepend(this),this},a.before=function(a){if(\"set\"==a.type){var b=this;return a.forEach(function(a){var c=a.parent();b.node.parentNode.insertBefore(a.node,b.node),c&&c.add()}),this.parent().add(),this}a=z(a);var c=a.parent();return this.node.parentNode.insertBefore(a.node,this.node),this.parent()&&this.parent().add(),c&&c.add(),a.paper=this.paper,this},a.after=function(a){a=z(a);var b=a.parent();return this.node.nextSibling?this.node.parentNode.insertBefore(a.node,this.node.nextSibling):this.node.parentNode.appendChild(a.node),this.parent()&&this.parent().add(),b&&b.add(),a.paper=this.paper,this},a.insertBefore=function(a){a=z(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},a.insertAfter=function(a){a=z(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node.nextSibling),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},a.remove=function(){var a=this.parent();return this.node.parentNode&&this.node.parentNode.removeChild(this.node),delete this.paper,this.removed=!0,a&&a.add(),this},a.select=function(a){return z(this.node.querySelector(a))},a.selectAll=function(a){for(var b=this.node.querySelectorAll(a),c=(d.set||Array)(),e=0;e<b.length;e++)c.push(z(b[e]));return c},a.asPX=function(a,b){return null==b&&(b=this.attr(a)),+s(this,a,b)},a.use=function(){var a,b=this.node.id;return b||(b=this.id,e(this.node,{id:b})),a=\"linearGradient\"==this.type||\"radialGradient\"==this.type||\"pattern\"==this.type?x(this.type,this.node.parentNode):x(\"use\",this.node.parentNode),e(a.node,{\"xlink:href\":\"#\"+b}),a.original=this,a},a.clone=function(){var a=z(this.node.cloneNode(!0));return e(a.node,\"id\")&&e(a.node,{id:a.id}),g(a),a.insertAfter(this),a},a.toDefs=function(){var a=r(this);return a.appendChild(this.node),this},a.pattern=function(a,b,c,d){var g=x(\"pattern\",r(this));return null==a&&(a=this.getBBox()),f(a,\"object\")&&\"x\"in a&&(b=a.y,c=a.width,d=a.height,a=a.x),e(g.node,{x:a,y:b,width:c,height:d,patternUnits:\"userSpaceOnUse\",id:g.id,viewBox:[a,b,c,d].join(\" \")}),g.node.appendChild(this.node),g},a.marker=function(a,b,c,d,g,h){var i=x(\"marker\",r(this));return null==a&&(a=this.getBBox()),f(a,\"object\")&&\"x\"in a&&(b=a.y,c=a.width,d=a.height,g=a.refX||a.cx,h=a.refY||a.cy,a=a.x),e(i.node,{viewBox:[a,b,c,d].join(T),markerWidth:c,markerHeight:d,orient:\"auto\",refX:g||0,refY:h||0,id:i.id}),i.node.appendChild(this.node),i};var k=function(a,b,d,e){\"function\"!=typeof d||d.length||(e=d,d=c.linear),this.attr=a,this.dur=b,d&&(this.easing=d),e&&(this.callback=e)};d.animation=function(a,b,c,d){return new k(a,b,c,d)},a.inAnim=function(){var a=this,b=[];for(var c in a.anims)a.anims[J](c)&&!function(a){b.push({anim:new k(a._attrs,a.dur,a.easing,a._callback),curStatus:a.status(),status:function(b){return a.status(b)},stop:function(){a.stop()}})}(a.anims[c]);return b},d.animate=function(a,d,e,f,g,h){\"function\"!=typeof g||g.length||(h=g,g=c.linear);var i=c.time(),j=c(a,d,i,i+f,c.time,e,g);return h&&b.once(\"mina.finish.\"+j.id,h),j},a.stop=function(){for(var a=this.inAnim(),b=0,c=a.length;c>b;b++)a[b].stop();return this},a.animate=function(a,d,e,g){\"function\"!=typeof e||e.length||(g=e,e=c.linear),a instanceof k&&(g=a.callback,e=a.easing,d=e.dur,a=a.attr);var i,j,l,m,n=[],o=[],p={},q=this;for(var r in a)if(a[J](r)){q.equal?(m=q.equal(r,K(a[r])),i=m.from,j=m.to,l=m.f):(i=+q.attr(r),j=+a[r]);var s=f(i,\"array\")?i.length:1;p[r]=h(n.length,n.length+s,l),n=n.concat(i),o=o.concat(j)}var t=c.time(),u=c(n,o,t,t+d,c.time,function(a){var b={};for(var c in p)p[J](c)&&(b[c]=p[c](a));q.attr(b)},e);return q.anims[u.id]=u,u._attrs=a,u._callback=g,b.once(\"mina.finish.\"+u.id,function(){delete q.anims[u.id],g&&g.call(q)}),b.once(\"mina.stop.\"+u.id,function(){delete q.anims[u.id]}),q};var l={};a.data=function(a,c){var e=l[this.id]=l[this.id]||{};if(0==arguments.length)return b(\"snap.data.get.\"+this.id,this,e,null),e;if(1==arguments.length){if(d.is(a,\"object\")){for(var f in a)a[J](f)&&this.data(f,a[f]);return this}return b(\"snap.data.get.\"+this.id,this,e[a],a),e[a]}return e[a]=c,b(\"snap.data.set.\"+this.id,this,c,a),this},a.removeData=function(a){return null==a?l[this.id]={}:l[this.id]&&delete l[this.id][a],this},a.outerSVG=a.toString=i(1),a.innerSVG=i()}(u.prototype),d.parse=function(a){var b=I.doc.createDocumentFragment(),c=!0,d=I.doc.createElement(\"div\");if(a=K(a),a.match(/^\\s*<\\s*svg(?:\\s|>)/)||(a=\"<svg>\"+a+\"</svg>\",c=!1),d.innerHTML=a,a=d.getElementsByTagName(\"svg\")[0])if(c)b=a;else for(;a.firstChild;)b.appendChild(a.firstChild);return d.innerHTML=S,new w(b)},w.prototype.select=u.prototype.select,w.prototype.selectAll=u.prototype.selectAll,d.fragment=function(){for(var a=Array.prototype.slice.call(arguments,0),b=I.doc.createDocumentFragment(),c=0,e=a.length;e>c;c++){var f=a[c];f.node&&f.node.nodeType&&b.appendChild(f.node),f.nodeType&&b.appendChild(f),\"string\"==typeof f&&b.appendChild(d.parse(f).node)}return new w(b)},function(a){a.el=function(a,b){return x(a,this.node).attr(b)},a.rect=function(a,b,c,d,e,g){var h;return null==g&&(g=e),f(a,\"object\")&&\"x\"in a?h=a:null!=a&&(h={x:a,y:b,width:c,height:d},null!=e&&(h.rx=e,h.ry=g)),this.el(\"rect\",h)},a.circle=function(a,b,c){var d;return f(a,\"object\")&&\"cx\"in a?d=a:null!=a&&(d={cx:a,cy:b,r:c}),this.el(\"circle\",d)},a.image=function(a,b,c,d,g){var h=x(\"image\",this.node);if(f(a,\"object\")&&\"src\"in a)h.attr(a);else if(null!=a){var i={\"xlink:href\":a,preserveAspectRatio:\"none\"};null!=b&&null!=c&&(i.x=b,i.y=c),null!=d&&null!=g?(i.width=d,i.height=g):jb(a,function(){e(h.node,{width:this.offsetWidth,height:this.offsetHeight})}),e(h.node,i)}return h},a.ellipse=function(a,b,c,d){var e=x(\"ellipse\",this.node);return f(a,\"object\")&&\"cx\"in a?e.attr(a):null!=a&&e.attr({cx:a,cy:b,rx:c,ry:d}),e},a.path=function(a){var b=x(\"path\",this.node);\nreturn f(a,\"object\")&&!f(a,\"array\")?b.attr(a):a&&b.attr({d:a}),b},a.group=a.g=function(b){var c=x(\"g\",this.node);c.add=t;for(var d in a)a[J](d)&&(c[d]=a[d]);return 1==arguments.length&&b&&!b.type?c.attr(b):arguments.length&&c.add(Array.prototype.slice.call(arguments,0)),c},a.text=function(a,b,c){var d=x(\"text\",this.node);return f(a,\"object\")?d.attr(a):null!=a&&d.attr({x:a,y:b,text:c||\"\"}),d},a.line=function(a,b,c,d){var e=x(\"line\",this.node);return f(a,\"object\")?e.attr(a):null!=a&&e.attr({x1:a,x2:c,y1:b,y2:d}),e},a.polyline=function(a){arguments.length>1&&(a=Array.prototype.slice.call(arguments,0));var b=x(\"polyline\",this.node);return f(a,\"object\")&&!f(a,\"array\")?b.attr(a):null!=a&&b.attr({points:a}),b},a.polygon=function(a){arguments.length>1&&(a=Array.prototype.slice.call(arguments,0));var b=x(\"polygon\",this.node);return f(a,\"object\")&&!f(a,\"array\")?b.attr(a):null!=a&&b.attr({points:a}),b},function(){a.gradient=function(a){return D(this.defs,a)},a.gradientLinear=function(a,b,c,d){return E(this.defs,a,b,c,d)},a.gradientRadial=function(a,b,c,d,e){return F(this.defs,a,b,c,d,e)},a.toString=function(){var a,b=I.doc.createDocumentFragment(),c=I.doc.createElement(\"div\"),d=this.node.cloneNode(!0);return b.appendChild(c),c.appendChild(d),e(d,{xmlns:gb}),a=c.innerHTML,b.removeChild(b.firstChild),a},a.clear=function(){for(var a,b=this.node.firstChild;b;)a=b.nextSibling,\"defs\"!=b.tagName&&b.parentNode.removeChild(b),b=a}}()}(y.prototype),d.ajax=function(a,c,d,e){var g=new XMLHttpRequest,h=eb();if(g){if(f(c,\"function\"))e=d,d=c,c=null;else if(f(c,\"object\")){var i=[];for(var j in c)c.hasOwnProperty(j)&&i.push(encodeURIComponent(j)+\"=\"+encodeURIComponent(c[j]));c=i.join(\"&\")}return g.open(c?\"POST\":\"GET\",a,!0),g.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),c&&g.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\"),d&&(b.once(\"snap.ajax.\"+h+\".0\",d),b.once(\"snap.ajax.\"+h+\".200\",d),b.once(\"snap.ajax.\"+h+\".304\",d)),g.onreadystatechange=function(){4==g.readyState&&b(\"snap.ajax.\"+h+\".\"+g.status,e,g)},4==g.readyState?g:(g.send(c),g)}},d.load=function(a,b,c){d.ajax(a,function(a){var e=d.parse(a.responseText);c?b.call(c,e):b(e)})},b.on(\"snap.util.attr.mask\",function(a){if(a instanceof u||a instanceof w){if(b.stop(),a instanceof w&&1==a.node.childNodes.length&&(a=a.node.firstChild,r(this).appendChild(a),a=z(a)),\"mask\"==a.type)var c=a;else c=x(\"mask\",r(this)),c.node.appendChild(a.node),!c.node.id&&e(c.node,{id:c.id});e(this.node,{mask:ib(c.id)})}}),function(a){b.on(\"snap.util.attr.clip\",a),b.on(\"snap.util.attr.clip-path\",a),b.on(\"snap.util.attr.clipPath\",a)}(function(a){if(a instanceof u||a instanceof w){if(b.stop(),\"clipPath\"==a.type)var c=a;else c=x(\"clipPath\",r(this)),c.node.appendChild(a.node),!c.node.id&&e(c.node,{id:c.id});e(this.node,{\"clip-path\":ib(c.id)})}}),b.on(\"snap.util.attr.fill\",G(\"fill\")),b.on(\"snap.util.attr.stroke\",G(\"stroke\"));var sb=/^([lr])(?:\\(([^)]*)\\))?(.*)$/i;b.on(\"snap.util.grad.parse\",function(a){a=K(a);var b=a.match(sb);if(!b)return null;var c=b[1],d=b[2],e=b[3];return d=d.split(/\\s*,\\s*/).map(function(a){return+a==a?+a:a}),1==d.length&&0==d[0]&&(d=[]),e=e.split(\"-\"),e=e.map(function(a){a=a.split(\":\");var b={color:a[0]};return a[1]&&(b.offset=a[1]),b}),{type:c,params:d,stops:e}}),b.on(\"snap.util.attr.d\",function(a){b.stop(),f(a,\"array\")&&f(a[0],\"array\")&&(a=d.path.toString.call(a)),a=K(a),a.match(/[ruo]/i)&&(a=d.path.toAbsolute(a)),e(this.node,{d:a})})(-1),b.on(\"snap.util.attr.#text\",function(a){b.stop(),a=K(a);for(var c=I.doc.createTextNode(a);this.node.firstChild;)this.node.removeChild(this.node.firstChild);this.node.appendChild(c)})(-1),b.on(\"snap.util.attr.path\",function(a){b.stop(),this.attr({d:a})})(-1),b.on(\"snap.util.attr.viewBox\",function(a){var c;c=f(a,\"object\")&&\"x\"in a?[a.x,a.y,a.width,a.height].join(\" \"):f(a,\"array\")?a.join(\" \"):a,e(this.node,{viewBox:c}),b.stop()})(-1),b.on(\"snap.util.attr.transform\",function(a){this.transform(a),b.stop()})(-1),b.on(\"snap.util.attr.r\",function(a){\"rect\"==this.type&&(b.stop(),e(this.node,{rx:a,ry:a}))})(-1),b.on(\"snap.util.attr.textpath\",function(a){if(b.stop(),\"text\"==this.type){var c,d,g;if(!a&&this.textPath){for(d=this.textPath;d.node.firstChild;)this.node.appendChild(d.node.firstChild);return d.remove(),void delete this.textPath}if(f(a,\"string\")){var h=r(this),i=z(h.parentNode).path(a);h.appendChild(i.node),c=i.id,i.attr({id:c})}else a=z(a),a instanceof u&&(c=a.attr(\"id\"),c||(c=a.id,a.attr({id:c})));if(c)if(d=this.textPath,g=this.node,d)d.attr({\"xlink:href\":\"#\"+c});else{for(d=e(\"textPath\",{\"xlink:href\":\"#\"+c});g.firstChild;)d.appendChild(g.firstChild);g.appendChild(d),this.textPath=z(d)}}})(-1),b.on(\"snap.util.attr.text\",function(a){if(\"text\"==this.type){for(var c=this.node,d=function(a){var b=e(\"tspan\");if(f(a,\"array\"))for(var c=0;c<a.length;c++)b.appendChild(d(a[c]));else b.appendChild(I.doc.createTextNode(a));return b.normalize&&b.normalize(),b};c.firstChild;)c.removeChild(c.firstChild);for(var g=d(a);g.firstChild;)c.appendChild(g.firstChild)}b.stop()})(-1);var tb={\"alignment-baseline\":0,\"baseline-shift\":0,clip:0,\"clip-path\":0,\"clip-rule\":0,color:0,\"color-interpolation\":0,\"color-interpolation-filters\":0,\"color-profile\":0,\"color-rendering\":0,cursor:0,direction:0,display:0,\"dominant-baseline\":0,\"enable-background\":0,fill:0,\"fill-opacity\":0,\"fill-rule\":0,filter:0,\"flood-color\":0,\"flood-opacity\":0,font:0,\"font-family\":0,\"font-size\":0,\"font-size-adjust\":0,\"font-stretch\":0,\"font-style\":0,\"font-variant\":0,\"font-weight\":0,\"glyph-orientation-horizontal\":0,\"glyph-orientation-vertical\":0,\"image-rendering\":0,kerning:0,\"letter-spacing\":0,\"lighting-color\":0,marker:0,\"marker-end\":0,\"marker-mid\":0,\"marker-start\":0,mask:0,opacity:0,overflow:0,\"pointer-events\":0,\"shape-rendering\":0,\"stop-color\":0,\"stop-opacity\":0,stroke:0,\"stroke-dasharray\":0,\"stroke-dashoffset\":0,\"stroke-linecap\":0,\"stroke-linejoin\":0,\"stroke-miterlimit\":0,\"stroke-opacity\":0,\"stroke-width\":0,\"text-anchor\":0,\"text-decoration\":0,\"text-rendering\":0,\"unicode-bidi\":0,visibility:0,\"word-spacing\":0,\"writing-mode\":0};b.on(\"snap.util.attr\",function(a){var c=b.nt(),d={};c=c.substring(c.lastIndexOf(\".\")+1),d[c]=a;var f=c.replace(/-(\\w)/gi,function(a,b){return b.toUpperCase()}),g=c.replace(/[A-Z]/g,function(a){return\"-\"+a.toLowerCase()});tb[J](g)?this.node.style[f]=null==a?S:a:e(this.node,d)}),b.on(\"snap.util.getattr.transform\",function(){return b.stop(),this.transform()})(-1),b.on(\"snap.util.getattr.textpath\",function(){return b.stop(),this.textPath})(-1),function(){function a(a){return function(){b.stop();var c=I.doc.defaultView.getComputedStyle(this.node,null).getPropertyValue(\"marker-\"+a);return\"none\"==c?c:d(I.doc.getElementById(c.match(W)[1]))}}function c(a){return function(c){b.stop();var d=\"marker\"+a.charAt(0).toUpperCase()+a.substring(1);if(\"\"==c||!c)return void(this.node.style[d]=\"none\");if(\"marker\"==c.type){var f=c.node.id;return f||e(c.node,{id:c.id}),void(this.node.style[d]=ib(f))}}}b.on(\"snap.util.getattr.marker-end\",a(\"end\"))(-1),b.on(\"snap.util.getattr.markerEnd\",a(\"end\"))(-1),b.on(\"snap.util.getattr.marker-start\",a(\"start\"))(-1),b.on(\"snap.util.getattr.markerStart\",a(\"start\"))(-1),b.on(\"snap.util.getattr.marker-mid\",a(\"mid\"))(-1),b.on(\"snap.util.getattr.markerMid\",a(\"mid\"))(-1),b.on(\"snap.util.attr.marker-end\",c(\"end\"))(-1),b.on(\"snap.util.attr.markerEnd\",c(\"end\"))(-1),b.on(\"snap.util.attr.marker-start\",c(\"start\"))(-1),b.on(\"snap.util.attr.markerStart\",c(\"start\"))(-1),b.on(\"snap.util.attr.marker-mid\",c(\"mid\"))(-1),b.on(\"snap.util.attr.markerMid\",c(\"mid\"))(-1)}(),b.on(\"snap.util.getattr.r\",function(){return\"rect\"==this.type&&e(this.node,\"rx\")==e(this.node,\"ry\")?(b.stop(),e(this.node,\"rx\")):void 0})(-1),b.on(\"snap.util.getattr.text\",function(){if(\"text\"==this.type||\"tspan\"==this.type){b.stop();var a=H(this.node);return 1==a.length?a[0]:a}})(-1),b.on(\"snap.util.getattr.#text\",function(){return this.node.textContent})(-1),b.on(\"snap.util.getattr.viewBox\",function(){b.stop();var a=e(this.node,\"viewBox\").split(Y);return d._.box(+a[0],+a[1],+a[2],+a[3])})(-1),b.on(\"snap.util.getattr.points\",function(){var a=e(this.node,\"points\");return b.stop(),a.split(Y)}),b.on(\"snap.util.getattr.path\",function(){var a=e(this.node,\"d\");return b.stop(),a}),b.on(\"snap.util.getattr\",function(){var a=b.nt();a=a.substring(a.lastIndexOf(\".\")+1);var c=a.replace(/[A-Z]/g,function(a){return\"-\"+a.toLowerCase()});return tb[J](c)?I.doc.defaultView.getComputedStyle(this.node,null).getPropertyValue(c):e(this.node,a)});var ub=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};return d.getElementByPoint=function(a,b){var c=this,d=(c.canvas,I.doc.elementFromPoint(a,b));if(I.win.opera&&\"svg\"==d.tagName){var e=ub(d),f=d.createSVGRect();f.x=a-e.x,f.y=b-e.y,f.width=f.height=1;var g=d.getIntersectionList(f,null);g.length&&(d=g[g.length-1])}return d?z(d):null},d.plugin=function(a){a(d,u,y,I)},I.win.Snap=d,d}();return d.plugin(function(a,b){function c(a){var b=c.ps=c.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[L](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]}function d(a,b,c,d){return null==a&&(a=b=c=d=0),null==b&&(b=a.y,c=a.width,d=a.height,a=a.x),{x:a,y:b,width:c,w:c,height:d,h:d,x2:a+c,y2:b+d,cx:a+c/2,cy:b+d/2,r1:O.min(c,d)/2,r2:O.max(c,d)/2,r0:O.sqrt(c*c+d*d)/2,path:w(a,b,c,d),vb:[a,b,c,d].join(\" \")}}function e(){return this.join(\",\").replace(M,\"$1\")}function f(a){var b=K(a);return b.toString=e,b}function g(a,b,c,d,e,f,g,h,j){return null==j?n(a,b,c,d,e,f,g,h):i(a,b,c,d,e,f,g,h,o(a,b,c,d,e,f,g,h,j))}function h(c,d){function e(a){return+(+a).toFixed(3)}return a._.cacher(function(a,f,h){a instanceof b&&(a=a.attr(\"d\")),a=F(a);for(var j,k,l,m,n,o=\"\",p={},q=0,r=0,s=a.length;s>r;r++){if(l=a[r],\"M\"==l[0])j=+l[1],k=+l[2];else{if(m=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6]),q+m>f){if(d&&!p.start){if(n=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6],f-q),o+=[\"C\"+e(n.start.x),e(n.start.y),e(n.m.x),e(n.m.y),e(n.x),e(n.y)],h)return o;p.start=o,o=[\"M\"+e(n.x),e(n.y)+\"C\"+e(n.n.x),e(n.n.y),e(n.end.x),e(n.end.y),e(l[5]),e(l[6])].join(),q+=m,j=+l[5],k=+l[6];continue}if(!c&&!d)return n=g(j,k,l[1],l[2],l[3],l[4],l[5],l[6],f-q)}q+=m,j=+l[5],k=+l[6]}o+=l.shift()+l}return p.end=o,n=c?q:d?p:i(j,k,l[0],l[1],l[2],l[3],l[4],l[5],1)},null,a._.clone)}function i(a,b,c,d,e,f,g,h,i){var j=1-i,k=S(j,3),l=S(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*O.atan2(q-s,r-t)/P;return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}}function j(b,c,e,f,g,h,i,j){a.is(b,\"array\")||(b=[b,c,e,f,g,h,i,j]);var k=E.apply(null,b);return d(k.min.x,k.min.y,k.max.x-k.min.x,k.max.y-k.min.y)}function k(a,b,c){return b>=a.x&&b<=a.x+a.width&&c>=a.y&&c<=a.y+a.height}function l(a,b){return a=d(a),b=d(b),k(b,a.x,a.y)||k(b,a.x2,a.y)||k(b,a.x,a.y2)||k(b,a.x2,a.y2)||k(a,b.x,b.y)||k(a,b.x2,b.y)||k(a,b.x,b.y2)||k(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)}function m(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function n(a,b,c,d,e,f,g,h,i){null==i&&(i=1),i=i>1?1:0>i?0:i;for(var j=i/2,k=12,l=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;k>p;p++){var q=j*l[p]+j,r=m(q,a,c,e,g),s=m(q,b,d,f,h),t=r*r+s*s;o+=n[p]*O.sqrt(t)}return j*o}function o(a,b,c,d,e,f,g,h,i){if(!(0>i||n(a,b,c,d,e,f,g,h)<i)){var j,k=1,l=k/2,m=k-l,o=.01;for(j=n(a,b,c,d,e,f,g,h,m);T(j-i)>o;)l/=2,m+=(i>j?1:-1)*l,j=n(a,b,c,d,e,f,g,h,m);return m}}function p(a,b,c,d,e,f,g,h){if(!(R(a,c)<Q(e,g)||Q(a,c)>R(e,g)||R(b,d)<Q(f,h)||Q(b,d)>R(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+Q(a,c).toFixed(2)||n>+R(a,c).toFixed(2)||n<+Q(e,g).toFixed(2)||n>+R(e,g).toFixed(2)||o<+Q(b,d).toFixed(2)||o>+R(b,d).toFixed(2)||o<+Q(f,h).toFixed(2)||o>+R(f,h).toFixed(2)))return{x:l,y:m}}}}function q(a,b,c){var d=j(a),e=j(b);if(!l(d,e))return c?0:[];for(var f=n.apply(0,a),g=n.apply(0,b),h=~~(f/5),k=~~(g/5),m=[],o=[],q={},r=c?0:[],s=0;h+1>s;s++){var t=i.apply(0,a.concat(s/h));m.push({x:t.x,y:t.y,t:s/h})}for(s=0;k+1>s;s++)t=i.apply(0,b.concat(s/k)),o.push({x:t.x,y:t.y,t:s/k});for(s=0;h>s;s++)for(var u=0;k>u;u++){var v=m[s],w=m[s+1],x=o[u],y=o[u+1],z=T(w.x-v.x)<.001?\"y\":\"x\",A=T(y.x-x.x)<.001?\"y\":\"x\",B=p(v.x,v.y,w.x,w.y,x.x,x.y,y.x,y.y);if(B){if(q[B.x.toFixed(4)]==B.y.toFixed(4))continue;q[B.x.toFixed(4)]=B.y.toFixed(4);var C=v.t+T((B[z]-v[z])/(w[z]-v[z]))*(w.t-v.t),D=x.t+T((B[A]-x[A])/(y[A]-x[A]))*(y.t-x.t);C>=0&&1>=C&&D>=0&&1>=D&&(c?r++:r.push({x:B.x,y:B.y,t1:C,t2:D}))}}return r}function r(a,b){return t(a,b)}function s(a,b){return t(a,b,1)}function t(a,b,c){a=F(a),b=F(b);for(var d,e,f,g,h,i,j,k,l,m,n=c?0:[],o=0,p=a.length;p>o;o++){var r=a[o];if(\"M\"==r[0])d=h=r[1],e=i=r[2];else{\"C\"==r[0]?(l=[d,e].concat(r.slice(1)),d=l[6],e=l[7]):(l=[d,e,d,e,h,i,h,i],d=h,e=i);for(var s=0,t=b.length;t>s;s++){var u=b[s];if(\"M\"==u[0])f=j=u[1],g=k=u[2];else{\"C\"==u[0]?(m=[f,g].concat(u.slice(1)),f=m[6],g=m[7]):(m=[f,g,f,g,j,k,j,k],f=j,g=k);var v=q(l,m,c);if(c)n+=v;else{for(var w=0,x=v.length;x>w;w++)v[w].segment1=o,v[w].segment2=s,v[w].bez1=l,v[w].bez2=m;n=n.concat(v)}}}}}return n}function u(a,b,c){var d=v(a);return k(d,b,c)&&t(a,[[\"M\",b,c],[\"H\",d.x2+10]],1)%2==1}function v(a){var b=c(a);if(b.bbox)return K(b.bbox);if(!a)return d();a=F(a);for(var e,f=0,g=0,h=[],i=[],j=0,k=a.length;k>j;j++)if(e=a[j],\"M\"==e[0])f=e[1],g=e[2],h.push(f),i.push(g);else{var l=E(f,g,e[1],e[2],e[3],e[4],e[5],e[6]);h=h.concat(l.min.x,l.max.x),i=i.concat(l.min.y,l.max.y),f=e[5],g=e[6]}var m=Q.apply(0,h),n=Q.apply(0,i),o=R.apply(0,h),p=R.apply(0,i),q=d(m,n,o-m,p-n);return b.bbox=K(q),q}function w(a,b,c,d,f){if(f)return[[\"M\",a+f,b],[\"l\",c-2*f,0],[\"a\",f,f,0,0,1,f,f],[\"l\",0,d-2*f],[\"a\",f,f,0,0,1,-f,f],[\"l\",2*f-c,0],[\"a\",f,f,0,0,1,-f,-f],[\"l\",0,2*f-d],[\"a\",f,f,0,0,1,f,-f],[\"z\"]];var g=[[\"M\",a,b],[\"l\",c,0],[\"l\",0,d],[\"l\",-c,0],[\"z\"]];return g.toString=e,g}function x(a,b,c,d,f){if(null==f&&null==d&&(d=c),null!=f)var g=Math.PI/180,h=a+c*Math.cos(-d*g),i=a+c*Math.cos(-f*g),j=b+c*Math.sin(-d*g),k=b+c*Math.sin(-f*g),l=[[\"M\",h,j],[\"A\",c,c,0,+(f-d>180),0,i,k]];else l=[[\"M\",a,b],[\"m\",0,-d],[\"a\",c,d,0,1,1,0,2*d],[\"a\",c,d,0,1,1,0,-2*d],[\"z\"]];return l.toString=e,l}function y(b){var d=c(b),g=String.prototype.toLowerCase;if(d.rel)return f(d.rel);a.is(b,\"array\")&&a.is(b&&b[0],\"array\")||(b=a.parsePathString(b));var h=[],i=0,j=0,k=0,l=0,m=0;\"M\"==b[0][0]&&(i=b[0][1],j=b[0][2],k=i,l=j,m++,h.push([\"M\",i,j]));for(var n=m,o=b.length;o>n;n++){var p=h[n]=[],q=b[n];if(q[0]!=g.call(q[0]))switch(p[0]=g.call(q[0]),p[0]){case\"a\":p[1]=q[1],p[2]=q[2],p[3]=q[3],p[4]=q[4],p[5]=q[5],p[6]=+(q[6]-i).toFixed(3),p[7]=+(q[7]-j).toFixed(3);break;case\"v\":p[1]=+(q[1]-j).toFixed(3);break;case\"m\":k=q[1],l=q[2];default:for(var r=1,s=q.length;s>r;r++)p[r]=+(q[r]-(r%2?i:j)).toFixed(3)}else{p=h[n]=[],\"m\"==q[0]&&(k=q[1]+i,l=q[2]+j);for(var t=0,u=q.length;u>t;t++)h[n][t]=q[t]}var v=h[n].length;switch(h[n][0]){case\"z\":i=k,j=l;break;case\"h\":i+=+h[n][v-1];break;case\"v\":j+=+h[n][v-1];break;default:i+=+h[n][v-2],j+=+h[n][v-1]}}return h.toString=e,d.rel=f(h),h}function z(b){var d=c(b);if(d.abs)return f(d.abs);if(J(b,\"array\")&&J(b&&b[0],\"array\")||(b=a.parsePathString(b)),!b||!b.length)return[[\"M\",0,0]];var g,h=[],i=0,j=0,k=0,l=0,m=0;\"M\"==b[0][0]&&(i=+b[0][1],j=+b[0][2],k=i,l=j,m++,h[0]=[\"M\",i,j]);for(var n,o,p=3==b.length&&\"M\"==b[0][0]&&\"R\"==b[1][0].toUpperCase()&&\"Z\"==b[2][0].toUpperCase(),q=m,r=b.length;r>q;q++){if(h.push(n=[]),o=b[q],g=o[0],g!=g.toUpperCase())switch(n[0]=g.toUpperCase(),n[0]){case\"A\":n[1]=o[1],n[2]=o[2],n[3]=o[3],n[4]=o[4],n[5]=o[5],n[6]=+(o[6]+i),n[7]=+(o[7]+j);break;case\"V\":n[1]=+o[1]+j;break;case\"H\":n[1]=+o[1]+i;break;case\"R\":for(var s=[i,j].concat(o.slice(1)),t=2,u=s.length;u>t;t++)s[t]=+s[t]+i,s[++t]=+s[t]+j;h.pop(),h=h.concat(H(s,p));break;case\"O\":h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);break;case\"U\":h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=[\"U\"].concat(h[h.length-1].slice(-2));break;case\"M\":k=+o[1]+i,l=+o[2]+j;default:for(t=1,u=o.length;u>t;t++)n[t]=+o[t]+(t%2?i:j)}else if(\"R\"==g)s=[i,j].concat(o.slice(1)),h.pop(),h=h.concat(H(s,p)),n=[\"R\"].concat(o.slice(-2));else if(\"O\"==g)h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);else if(\"U\"==g)h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=[\"U\"].concat(h[h.length-1].slice(-2));else for(var v=0,w=o.length;w>v;v++)n[v]=o[v];if(g=g.toUpperCase(),\"O\"!=g)switch(n[0]){case\"Z\":i=k,j=l;break;case\"H\":i=n[1];break;case\"V\":j=n[1];break;case\"M\":k=n[n.length-2],l=n[n.length-1];default:i=n[n.length-2],j=n[n.length-1]}}return h.toString=e,d.abs=f(h),h}function A(a,b,c,d){return[a,b,c,d,c,d]}function B(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]}function C(b,c,d,e,f,g,h,i,j,k){var l,m=120*P/180,n=P/180*(+f||0),o=[],p=a._.cacher(function(a,b,c){var d=a*O.cos(c)-b*O.sin(c),e=a*O.sin(c)+b*O.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(b,c,-n),b=l.x,c=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(O.cos(P/180*f),O.sin(P/180*f),(b-i)/2),r=(c-j)/2,s=q*q/(d*d)+r*r/(e*e);s>1&&(s=O.sqrt(s),d=s*d,e=s*e);var t=d*d,u=e*e,v=(g==h?-1:1)*O.sqrt(T((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*d*r/e+(b+i)/2,x=v*-e*q/d+(c+j)/2,y=O.asin(((c-x)/e).toFixed(9)),z=O.asin(((j-x)/e).toFixed(9));y=w>b?P-y:y,z=w>i?P-z:z,0>y&&(y=2*P+y),0>z&&(z=2*P+z),h&&y>z&&(y-=2*P),!h&&z>y&&(z-=2*P)}var A=z-y;if(T(A)>m){var B=z,D=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+d*O.cos(z),j=x+e*O.sin(z),o=C(i,j,d,e,f,0,h,D,E,[z,B,w,x])}A=z-y;var F=O.cos(y),G=O.sin(y),H=O.cos(z),I=O.sin(z),J=O.tan(A/4),K=4/3*d*J,L=4/3*e*J,M=[b,c],N=[b+K*G,c-L*F],Q=[i+K*I,j-L*H],R=[i,j];if(N[0]=2*M[0]-N[0],N[1]=2*M[1]-N[1],k)return[N,Q,R].concat(o);o=[N,Q,R].concat(o).join().split(\",\");for(var S=[],U=0,V=o.length;V>U;U++)S[U]=U%2?p(o[U-1],o[U],n).y:p(o[U],o[U+1],n).x;return S}function D(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:S(j,3)*a+3*S(j,2)*i*c+3*j*i*i*e+S(i,3)*g,y:S(j,3)*b+3*S(j,2)*i*d+3*j*i*i*f+S(i,3)*h}}function E(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+O.sqrt(k*k-4*j*l))/2/j,n=(-k-O.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return T(m)>\"1e12\"&&(m=.5),T(n)>\"1e12\"&&(n=.5),m>0&&1>m&&(i=D(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=D(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+O.sqrt(k*k-4*j*l))/2/j,n=(-k-O.sqrt(k*k-4*j*l))/2/j,T(m)>\"1e12\"&&(m=.5),T(n)>\"1e12\"&&(n=.5),m>0&&1>m&&(i=D(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=D(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:Q.apply(0,p),y:Q.apply(0,o)},max:{x:R.apply(0,p),y:R.apply(0,o)}}}function F(a,b){var d=!b&&c(a);if(!b&&d.curve)return f(d.curve);for(var e=z(a),g=b&&z(b),h={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},i={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},j=(function(a,b){var c,d;if(!a)return[\"C\",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case\"M\":b.X=a[1],b.Y=a[2];break;case\"A\":a=[\"C\"].concat(C.apply(0,[b.x,b.y].concat(a.slice(1))));break;case\"S\":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=[\"C\",c,d].concat(a.slice(1));break;case\"T\":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=[\"C\"].concat(B(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case\"Q\":b.qx=a[1],b.qy=a[2],a=[\"C\"].concat(B(b.x,b.y,a[1],a[2],a[3],a[4]));break;case\"L\":a=[\"C\"].concat(A(b.x,b.y,a[1],a[2]));break;case\"H\":a=[\"C\"].concat(A(b.x,b.y,a[1],b.y));break;case\"V\":a=[\"C\"].concat(A(b.x,b.y,b.x,a[1]));break;case\"Z\":a=[\"C\"].concat(A(b.x,b.y,b.X,b.Y))}return a}),k=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,[\"C\"].concat(c.splice(0,6)));a.splice(b,1),n=R(e.length,g&&g.length||0)}},l=function(a,b,c,d,f){a&&b&&\"M\"==a[f][0]&&\"M\"!=b[f][0]&&(b.splice(f,0,[\"M\",d.x,d.y]),c.bx=0,c.by=0,c.x=a[f][1],c.y=a[f][2],n=R(e.length,g&&g.length||0))},m=0,n=R(e.length,g&&g.length||0);n>m;m++){e[m]=j(e[m],h),k(e,m),g&&(g[m]=j(g[m],i)),g&&k(g,m),l(e,g,h,i,m),l(g,e,i,h,m);var o=e[m],p=g&&g[m],q=o.length,r=g&&p.length;h.x=o[q-2],h.y=o[q-1],h.bx=N(o[q-4])||h.x,h.by=N(o[q-3])||h.y,i.bx=g&&(N(p[r-4])||i.x),i.by=g&&(N(p[r-3])||i.y),i.x=g&&p[r-2],i.y=g&&p[r-1]}return g||(d.curve=f(e)),g?[e,g]:e}function G(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=F(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a}function H(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push([\"C\",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}var I=b.prototype,J=a.is,K=a._.clone,L=\"hasOwnProperty\",M=/,?([a-z]),?/gi,N=parseFloat,O=Math,P=O.PI,Q=O.min,R=O.max,S=O.pow,T=O.abs,U=h(1),V=h(),W=h(0,1),X=a._unit2px,Y={path:function(a){return a.attr(\"path\")},circle:function(a){var b=X(a);return x(b.cx,b.cy,b.r)},ellipse:function(a){var b=X(a);return x(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=X(a);return w(b.x,b.y,b.width,b.height,b.rx,b.ry)},image:function(a){var b=X(a);return w(b.x,b.y,b.width,b.height)},text:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)},g:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)},symbol:function(a){var b=a.getBBox();return w(b.x,b.y,b.width,b.height)},line:function(a){return\"M\"+[a.attr(\"x1\"),a.attr(\"y1\"),a.attr(\"x2\"),a.attr(\"y2\")]},polyline:function(a){return\"M\"+a.attr(\"points\")},polygon:function(a){return\"M\"+a.attr(\"points\")+\"z\"},svg:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)},deflt:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)}};a.path=c,a.path.getTotalLength=U,a.path.getPointAtLength=V,a.path.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return W(a,b).end;var d=W(a,c,1);return b?W(d,b).end:d},I.getTotalLength=function(){return this.node.getTotalLength?this.node.getTotalLength():void 0},I.getPointAtLength=function(a){return V(this.attr(\"d\"),a)},I.getSubpath=function(b,c){return a.path.getSubpath(this.attr(\"d\"),b,c)},a._.box=d,a.path.findDotsAtSegment=i,a.path.bezierBBox=j,a.path.isPointInsideBBox=k,a.path.isBBoxIntersect=l,a.path.intersection=r,a.path.intersectionNumber=s,a.path.isPointInside=u,a.path.getBBox=v,a.path.get=Y,a.path.toRelative=y,a.path.toAbsolute=z,a.path.toCubic=F,a.path.map=G,a.path.toString=e,a.path.clone=f}),d.plugin(function(a){var b=Math.max,c=Math.min,d=function(a){if(this.items=[],this.length=0,this.type=\"set\",a)for(var b=0,c=a.length;c>b;b++)a[b]&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},e=d.prototype;e.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],a&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},e.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},e.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this},e.remove=function(){for(;this.length;)this.pop().remove();return this},e.attr=function(a){for(var b=0,c=this.items.length;c>b;b++)this.items[b].attr(a);return this},e.clear=function(){for(;this.length;)this.pop()},e.splice=function(a,e){a=0>a?b(this.length+a,0):a,e=b(0,c(this.length-a,e));var f,g=[],h=[],i=[];for(f=2;f<arguments.length;f++)i.push(arguments[f]);for(f=0;e>f;f++)h.push(this[a+f]);for(;f<this.length-a;f++)g.push(this[a+f]);var j=i.length;for(f=0;f<j+g.length;f++)this.items[a+f]=this[a+f]=j>f?i[f]:g[f-j];for(f=this.items.length=this.length-=e-j;this[f];)delete this[f++];return new d(h)},e.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0;return!1},e.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},e.getBBox=function(){for(var a=[],d=[],e=[],f=[],g=this.items.length;g--;)if(!this.items[g].removed){var h=this.items[g].getBBox();a.push(h.x),d.push(h.y),e.push(h.x+h.width),f.push(h.y+h.height)}return a=c.apply(0,a),d=c.apply(0,d),e=b.apply(0,e),f=b.apply(0,f),{x:a,y:d,x2:e,y2:f,width:e-a,height:f-d,cx:a+(e-a)/2,cy:d+(f-d)/2}},e.clone=function(a){a=new d;for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},e.toString=function(){return\"Snap‘s set\"},e.type=\"set\",a.set=function(){var a=new d;return arguments.length&&a.push.apply(a,Array.prototype.slice.call(arguments,0)),a}}),d.plugin(function(a,b){function c(a){var b=a[0];switch(b.toLowerCase()){case\"t\":return[b,0,0];case\"m\":return[b,1,0,0,1,0,0];case\"r\":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case\"s\":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}}function d(b,d,e){d=l(d).replace(/\\.{3}|…/g,b),b=a.parseTransformString(b)||[],d=a.parseTransformString(d)||[];for(var f,g,j,k,m=Math.max(b.length,d.length),n=[],o=[],p=0;m>p;p++){if(j=b[p]||c(d[p]),k=d[p]||c(j),j[0]!=k[0]||\"r\"==j[0].toLowerCase()&&(j[2]!=k[2]||j[3]!=k[3])||\"s\"==j[0].toLowerCase()&&(j[3]!=k[3]||j[4]!=k[4])){b=a._.transform2matrix(b,e()),d=a._.transform2matrix(d,e()),n=[[\"m\",b.a,b.b,b.c,b.d,b.e,b.f]],o=[[\"m\",d.a,d.b,d.c,d.d,d.e,d.f]];break}for(n[p]=[],o[p]=[],f=0,g=Math.max(j.length,k.length);g>f;f++)f in j&&(n[p][f]=j[f]),f in k&&(o[p][f]=k[f])}return{from:i(n),to:i(o),f:h(n)}}function e(a){return a}function f(a){return function(b){return+b.toFixed(3)+a}}function g(b){return a.rgb(b[0],b[1],b[2])}function h(a){var b,c,d,e,f,g,h=0,i=[];for(b=0,c=a.length;c>b;b++){for(f=\"[\",g=['\"'+a[b][0]+'\"'],d=1,e=a[b].length;e>d;d++)g[d]=\"val[\"+h++ +\"]\";f+=g+\"]\",i[b]=f}return Function(\"val\",\"return Snap.path.toString.call([\"+i+\"])\")}function i(a){for(var b=[],c=0,d=a.length;d>c;c++)for(var e=1,f=a[c].length;f>e;e++)b.push(a[c][e]);return b}var j={},k=/[a-z]+$/i,l=String;j.stroke=j.fill=\"colour\",b.prototype.equal=function(b,c){var m,n,o=l(this.attr(b)||\"\"),p=this;if(o==+o&&c==+c)return{from:+o,to:+c,f:e};if(\"colour\"==j[b])return m=a.color(o),n=a.color(c),{from:[m.r,m.g,m.b,m.opacity],to:[n.r,n.g,n.b,n.opacity],f:g};if(\"transform\"==b||\"gradientTransform\"==b||\"patternTransform\"==b)return c instanceof a.Matrix&&(c=c.toTransformString()),a._.rgTransform.test(c)||(c=a._.svgTransform2string(c)),d(o,c,function(){return p.getBBox(1)});if(\"d\"==b||\"path\"==b)return m=a.path.toCubic(o,c),{from:i(m[0]),to:i(m[1]),f:h(m[0])};if(\"points\"==b)return m=l(o).split(\",\"),n=l(c).split(\",\"),{from:m,to:n,f:function(a){return a}};var q=o.match(k),r=l(c).match(k);return q&&q==r?{from:parseFloat(o),to:parseFloat(c),f:f(q)}:{from:this.asPX(b),to:this.asPX(b,c),f:e}}}),d.plugin(function(a,c,d,e){for(var f=c.prototype,g=\"hasOwnProperty\",h=(\"createTouch\"in e.doc),i=[\"click\",\"dblclick\",\"mousedown\",\"mousemove\",\"mouseout\",\"mouseover\",\"mouseup\",\"touchstart\",\"touchmove\",\"touchend\",\"touchcancel\"],j={mousedown:\"touchstart\",mousemove:\"touchmove\",mouseup:\"touchend\"},k=function(a){var b=\"y\"==a?\"scrollTop\":\"scrollLeft\";return e.doc.documentElement[b]||e.doc.body[b]},l=function(){this.returnValue=!1},m=function(){return this.originalEvent.preventDefault()},n=function(){this.cancelBubble=!0},o=function(){return this.originalEvent.stopPropagation()},p=function(){return e.doc.addEventListener?function(a,b,c,d){var e=h&&j[b]?j[b]:b,f=function(e){var f=k(\"y\"),i=k(\"x\");if(h&&j[g](b))for(var l=0,n=e.targetTouches&&e.targetTouches.length;n>l;l++)if(e.targetTouches[l].target==a||a.contains(e.targetTouches[l].target)){var p=e;e=e.targetTouches[l],e.originalEvent=p,e.preventDefault=m,e.stopPropagation=o;break}var q=e.clientX+i,r=e.clientY+f;return c.call(d,e,q,r)};return b!==e&&a.addEventListener(b,f,!1),a.addEventListener(e,f,!1),function(){return b!==e&&a.removeEventListener(b,f,!1),a.removeEventListener(e,f,!1),!0}}:e.doc.attachEvent?function(a,b,c,d){var f=function(a){a=a||e.win.event;var b=k(\"y\"),f=k(\"x\"),g=a.clientX+f,h=a.clientY+b;return a.preventDefault=a.preventDefault||l,a.stopPropagation=a.stopPropagation||n,c.call(d,a,g,h)};a.attachEvent(\"on\"+b,f);var g=function(){return a.detachEvent(\"on\"+b,f),!0};return g}:void 0}(),q=[],r=function(c){for(var d,e=c.clientX,f=c.clientY,g=k(\"y\"),i=k(\"x\"),j=q.length;j--;){if(d=q[j],h){for(var l,m=c.touches&&c.touches.length;m--;)if(l=c.touches[m],l.identifier==d.el._drag.id||d.el.node.contains(l.target)){e=l.clientX,f=l.clientY,(c.originalEvent?c.originalEvent:c).preventDefault();break}}else c.preventDefault();{var n=d.el.node;a._.glob,n.nextSibling,n.parentNode,n.style.display}e+=i,f+=g,b(\"snap.drag.move.\"+d.el.id,d.move_scope||d.el,e-d.el._drag.x,f-d.el._drag.y,e,f,c)}},s=function(c){a.unmousemove(r).unmouseup(s);for(var d,e=q.length;e--;)d=q[e],d.el._drag={},b(\"snap.drag.end.\"+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c);q=[]},t=i.length;t--;)!function(b){a[b]=f[b]=function(c,d){return a.is(c,\"function\")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:p(this.shape||this.node||e.doc,b,c,d||this)})),this},a[\"un\"+b]=f[\"un\"+b]=function(a){for(var c=this.events||[],d=c.length;d--;)if(c[d].name==b&&(c[d].f==a||!a))return c[d].unbind(),c.splice(d,1),!c.length&&delete this.events,this;return this}}(i[t]);f.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},f.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var u=[];f.drag=function(c,d,e,f,g,h){function i(i,j,k){(i.originalEvent||i).preventDefault(),this._drag.x=j,this._drag.y=k,this._drag.id=i.identifier,!q.length&&a.mousemove(r).mouseup(s),q.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on(\"snap.drag.start.\"+this.id,d),c&&b.on(\"snap.drag.move.\"+this.id,c),e&&b.on(\"snap.drag.end.\"+this.id,e),b(\"snap.drag.start.\"+this.id,g||f||this,j,k,i)}if(!arguments.length){var j;return this.drag(function(a,b){this.attr({transform:j+(j?\"T\":\"t\")+[a,b]})},function(){j=this.transform().local})}return this._drag={},u.push({el:this,start:i}),this.mousedown(i),this},f.undrag=function(){for(var c=u.length;c--;)u[c].el==this&&(this.unmousedown(u[c].start),u.splice(c,1),b.unbind(\"snap.drag.*.\"+this.id));return!u.length&&a.unmousemove(r).unmouseup(s),this}}),d.plugin(function(a,c,d){var e=(c.prototype,d.prototype),f=/^\\s*url\\((.+)\\)/,g=String,h=a._.$;a.filter={},e.filter=function(b){var d=this;\"svg\"!=d.type&&(d=d.paper);var e=a.parse(g(b)),f=a._.id(),i=(d.node.offsetWidth,d.node.offsetHeight,h(\"filter\"));return h(i,{id:f,filterUnits:\"userSpaceOnUse\"}),i.appendChild(e.node),d.defs.appendChild(i),new c(i)},b.on(\"snap.util.getattr.filter\",function(){b.stop();var c=h(this.node,\"filter\");if(c){var d=g(c).match(f);return d&&a.select(d[1])}}),b.on(\"snap.util.attr.filter\",function(d){if(d instanceof c&&\"filter\"==d.type){b.stop();var e=d.node.id;e||(h(d.node,{id:d.id}),e=d.id),h(this.node,{filter:a.url(e)})}d&&\"none\"!=d||(b.stop(),this.node.removeAttribute(\"filter\"))}),a.filter.blur=function(b,c){null==b&&(b=2);var d=null==c?b:[b,c];return a.format('<feGaussianBlur stdDeviation=\"{def}\"/>',{def:d})},a.filter.blur.toString=function(){return this()},a.filter.shadow=function(b,c,d,e){return e=e||\"#000\",null==d&&(d=4),\"string\"==typeof d&&(e=d,d=4),null==b&&(b=0,c=2),null==c&&(c=b),e=a.color(e),a.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>',{color:e,dx:b,dy:c,blur:d})},a.filter.shadow.toString=function(){return this()},a.filter.grayscale=function(b){return null==b&&(b=1),a.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>',{a:.2126+.7874*(1-b),b:.7152-.7152*(1-b),c:.0722-.0722*(1-b),d:.2126-.2126*(1-b),e:.7152+.2848*(1-b),f:.0722-.0722*(1-b),g:.2126-.2126*(1-b),h:.0722+.9278*(1-b)})\n},a.filter.grayscale.toString=function(){return this()},a.filter.sepia=function(b){return null==b&&(b=1),a.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>',{a:.393+.607*(1-b),b:.769-.769*(1-b),c:.189-.189*(1-b),d:.349-.349*(1-b),e:.686+.314*(1-b),f:.168-.168*(1-b),g:.272-.272*(1-b),h:.534-.534*(1-b),i:.131+.869*(1-b)})},a.filter.sepia.toString=function(){return this()},a.filter.saturate=function(b){return null==b&&(b=1),a.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>',{amount:1-b})},a.filter.saturate.toString=function(){return this()},a.filter.hueRotate=function(b){return b=b||0,a.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>',{angle:b})},a.filter.hueRotate.toString=function(){return this()},a.filter.invert=function(b){return null==b&&(b=1),a.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>',{amount:b,amount2:1-b})},a.filter.invert.toString=function(){return this()},a.filter.brightness=function(b){return null==b&&(b=1),a.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>',{amount:b})},a.filter.brightness.toString=function(){return this()},a.filter.contrast=function(b){return null==b&&(b=1),a.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>',{amount:b,amount2:.5-b/2})},a.filter.contrast.toString=function(){return this()}}),d});"
  },
  {
    "path": "demos/snap-ad/src/js/vendor/snap.svg.js",
    "content": "// Snap.svg 0.2.0\n// \n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// \n// build: 2013-12-23\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.4.2 - JavaScript Events Library                      │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n    var version = \"0.4.2\",\n        has = \"hasOwnProperty\",\n        separator = /[\\.\\/]/,\n        wildcard = \"*\",\n        fun = function () {},\n        numsort = function (a, b) {\n            return a - b;\n        },\n        current_event,\n        stop,\n        events = {n: {}},\n    /*\\\n     * eve\n     [ method ]\n\n     * Fires event with given `name`, given scope and other parameters.\n\n     > Arguments\n\n     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n     - scope (object) context for the event handlers\n     - varargs (...) the rest of arguments will be sent to event handlers\n\n     = (object) array of returned values from the listeners\n    \\*/\n        eve = function (name, scope) {\n\t\t\tname = String(name);\n            var e = events,\n                oldstop = stop,\n                args = Array.prototype.slice.call(arguments, 2),\n                listeners = eve.listeners(name),\n                z = 0,\n                f = false,\n                l,\n                indexed = [],\n                queue = {},\n                out = [],\n                ce = current_event,\n                errors = [];\n            current_event = name;\n            stop = 0;\n            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n                indexed.push(listeners[i].zIndex);\n                if (listeners[i].zIndex < 0) {\n                    queue[listeners[i].zIndex] = listeners[i];\n                }\n            }\n            indexed.sort(numsort);\n            while (indexed[z] < 0) {\n                l = queue[indexed[z++]];\n                out.push(l.apply(scope, args));\n                if (stop) {\n                    stop = oldstop;\n                    return out;\n                }\n            }\n            for (i = 0; i < ii; i++) {\n                l = listeners[i];\n                if (\"zIndex\" in l) {\n                    if (l.zIndex == indexed[z]) {\n                        out.push(l.apply(scope, args));\n                        if (stop) {\n                            break;\n                        }\n                        do {\n                            z++;\n                            l = queue[indexed[z]];\n                            l && out.push(l.apply(scope, args));\n                            if (stop) {\n                                break;\n                            }\n                        } while (l)\n                    } else {\n                        queue[l.zIndex] = l;\n                    }\n                } else {\n                    out.push(l.apply(scope, args));\n                    if (stop) {\n                        break;\n                    }\n                }\n            }\n            stop = oldstop;\n            current_event = ce;\n            return out.length ? out : null;\n        };\n\t\t// Undocumented. Debug only.\n\t\teve._events = events;\n    /*\\\n     * eve.listeners\n     [ method ]\n\n     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n     > Arguments\n\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n     = (array) array of event handlers\n    \\*/\n    eve.listeners = function (name) {\n        var names = name.split(separator),\n            e = events,\n            item,\n            items,\n            k,\n            i,\n            ii,\n            j,\n            jj,\n            nes,\n            es = [e],\n            out = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            nes = [];\n            for (j = 0, jj = es.length; j < jj; j++) {\n                e = es[j].n;\n                items = [e[names[i]], e[wildcard]];\n                k = 2;\n                while (k--) {\n                    item = items[k];\n                    if (item) {\n                        nes.push(item);\n                        out = out.concat(item.f || []);\n                    }\n                }\n            }\n            es = nes;\n        }\n        return out;\n    };\n    \n    /*\\\n     * eve.on\n     [ method ]\n     **\n     * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n     | eve.on(\"*.under.*\", f);\n     | eve(\"mouse.under.floor\"); // triggers f\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n     > Example:\n     | eve.on(\"mouse\", eatIt)(2);\n     | eve.on(\"mouse\", scream);\n     | eve.on(\"mouse\", catchIt)(1);\n     * This will ensure that `catchIt()` function will be called before `eatIt()`.\n\t *\n     * If you want to put your handler before non-indexed handlers, specify a negative value.\n     * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n    \\*/\n    eve.on = function (name, f) {\n\t\tname = String(name);\n\t\tif (typeof f != \"function\") {\n\t\t\treturn function () {};\n\t\t}\n        var names = name.split(separator),\n            e = events;\n        for (var i = 0, ii = names.length; i < ii; i++) {\n            e = e.n;\n            e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n        }\n        e.f = e.f || [];\n        for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n            return fun;\n        }\n        e.f.push(f);\n        return function (zIndex) {\n            if (+zIndex == +zIndex) {\n                f.zIndex = +zIndex;\n            }\n        };\n    };\n    /*\\\n     * eve.f\n     [ method ]\n     **\n     * Returns function that will fire given event with optional arguments.\n\t * Arguments that will be passed to the result function will be also\n\t * concated to the list of final arguments.\n \t | el.onclick = eve.f(\"click\", 1, 2);\n \t | eve.on(\"click\", function (a, b, c) {\n \t |     console.log(a, b, c); // 1, 2, [event object]\n \t | });\n     > Arguments\n\t - event (string) event name\n\t - varargs (…) and any other arguments\n\t = (function) possible event handler function\n    \\*/\n\teve.f = function (event) {\n\t\tvar attrs = [].slice.call(arguments, 1);\n\t\treturn function () {\n\t\t\teve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n\t\t};\n\t};\n    /*\\\n     * eve.stop\n     [ method ]\n     **\n     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n    \\*/\n    eve.stop = function () {\n        stop = 1;\n    };\n    /*\\\n     * eve.nt\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     > Arguments\n     **\n     - subname (string) #optional subname of the event\n     **\n     = (string) name of the event, if `subname` is not specified\n     * or\n     = (boolean) `true`, if current event’s name contains `subname`\n    \\*/\n    eve.nt = function (subname) {\n        if (subname) {\n            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(current_event);\n        }\n        return current_event;\n    };\n    /*\\\n     * eve.nts\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     **\n     = (array) names of the event\n    \\*/\n    eve.nts = function () {\n        return current_event.split(separator);\n    };\n    /*\\\n     * eve.off\n     [ method ]\n     **\n     * Removes given function from the list of event listeners assigned to given name.\n\t * If no arguments specified all the events will be cleared.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n    \\*/\n    /*\\\n     * eve.unbind\n     [ method ]\n     **\n     * See @eve.off\n    \\*/\n    eve.off = eve.unbind = function (name, f) {\n\t\tif (!name) {\n\t\t    eve._events = events = {n: {}};\n\t\t\treturn;\n\t\t}\n        var names = name.split(separator),\n            e,\n            key,\n            splice,\n            i, ii, j, jj,\n            cur = [events];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            for (j = 0; j < cur.length; j += splice.length - 2) {\n                splice = [j, 1];\n                e = cur[j].n;\n                if (names[i] != wildcard) {\n                    if (e[names[i]]) {\n                        splice.push(e[names[i]]);\n                    }\n                } else {\n                    for (key in e) if (e[has](key)) {\n                        splice.push(e[key]);\n                    }\n                }\n                cur.splice.apply(cur, splice);\n            }\n        }\n        for (i = 0, ii = cur.length; i < ii; i++) {\n            e = cur[i];\n            while (e.n) {\n                if (f) {\n                    if (e.f) {\n                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n                            e.f.splice(j, 1);\n                            break;\n                        }\n                        !e.f.length && delete e.f;\n                    }\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        var funcs = e.n[key].f;\n                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n                            funcs.splice(j, 1);\n                            break;\n                        }\n                        !funcs.length && delete e.n[key].f;\n                    }\n                } else {\n                    delete e.f;\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        delete e.n[key].f;\n                    }\n                }\n                e = e.n;\n            }\n        }\n    };\n    /*\\\n     * eve.once\n     [ method ]\n     **\n     * Binds given event handler with a given name to only run once then unbind itself.\n     | eve.once(\"login\", f);\n     | eve(\"login\"); // triggers f\n     | eve(\"login\"); // no listeners\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) same return function as @eve.on\n    \\*/\n    eve.once = function (name, f) {\n        var f2 = function () {\n            eve.unbind(name, f2);\n            return f.apply(this, arguments);\n        };\n        return eve.on(name, f2);\n    };\n    /*\\\n     * eve.version\n     [ property (string) ]\n     **\n     * Current version of the library.\n    \\*/\n    eve.version = version;\n    eve.toString = function () {\n        return \"You are running Eve \" + version;\n    };\n    (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : (typeof define != \"undefined\" ? (define(\"eve\", [], function() { return eve; })) : (glob.eve = eve));\n})(this);\n\n(function (glob, factory) {\n    // AMD support\n    if (typeof define === \"function\" && define.amd) {\n        // Define as an anonymous module\n        define([\"eve\"], function( eve ) {\n            return factory(glob, eve);\n        });\n    } else {\n        // Browser globals (glob is window)\n        // Snap adds itself to window\n        factory(glob, glob.eve);\n    }\n}(this, function (window, eve) {\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n    var animations = {},\n    requestAnimFrame = window.requestAnimationFrame       ||\n                       window.webkitRequestAnimationFrame ||\n                       window.mozRequestAnimationFrame    ||\n                       window.oRequestAnimationFrame      ||\n                       window.msRequestAnimationFrame     ||\n                       function (callback) {\n                           setTimeout(callback, 16);\n                       },\n    isArray = Array.isArray || function (a) {\n        return a instanceof Array ||\n            Object.prototype.toString.call(a) == \"[object Array]\";\n    },\n    idgen = 0,\n    idprefix = \"M\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    diff = function (a, b, A, B) {\n        if (isArray(a)) {\n            res = [];\n            for (var i = 0, ii = a.length; i < ii; i++) {\n                res[i] = diff(a[i], b, A[i], B);\n            }\n            return res;\n        }\n        var dif = (A - a) / (B - b);\n        return function (bb) {\n            return a + dif * (bb - b);\n        };\n    },\n    timer = Date.now || function () {\n        return +new Date;\n    },\n    sta = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.s;\n        }\n        var ds = a.s - val;\n        a.b += a.dur * ds;\n        a.B += a.dur * ds;\n        a.s = val;\n    },\n    speed = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.spd;\n        }\n        a.spd = val;\n    },\n    duration = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.dur;\n        }\n        a.s = a.s * val / a.dur;\n        a.dur = val;\n    },\n    stopit = function () {\n        var a = this;\n        delete animations[a.id];\n        eve(\"mina.stop.\" + a.id, a);\n    },\n    pause = function () {\n        var a = this;\n        if (a.pdif) {\n            return;\n        }\n        delete animations[a.id];\n        a.pdif = a.get() - a.b;\n    },\n    resume = function () {\n        var a = this;\n        if (!a.pdif) {\n            return;\n        }\n        a.b = a.get() - a.pdif;\n        delete a.pdif;\n        animations[a.id] = a;\n    },\n    frame = function () {\n        var len = 0;\n        for (var i in animations) if (animations.hasOwnProperty(i)) {\n            var a = animations[i],\n                b = a.get(),\n                res;\n            len++;\n            a.s = (b - a.b) / (a.dur / a.spd);\n            if (a.s >= 1) {\n                delete animations[i];\n                a.s = 1;\n                len--;\n                (function (a) {\n                    setTimeout(function () {\n                        eve(\"mina.finish.\" + a.id, a);\n                    });\n                }(a));\n            }\n            if (isArray(a.start)) {\n                res = [];\n                for (var j = 0, jj = a.start.length; j < jj; j++) {\n                    res[j] = +a.start[j] +\n                        (a.end[j] - a.start[j]) * a.easing(a.s);\n                }\n            } else {\n                res = +a.start + (a.end - a.start) * a.easing(a.s);\n            }\n            a.set(res);\n        }\n        len && requestAnimFrame(frame);\n    },\n    // SIERRA Unfamiliar with the word _slave_ in this context. Also, I don't know what _gereal_ means. Do you mean _general_?\n    /*\\\n     * mina\n     [ method ]\n     **\n     * Generic animation of numbers\n     **\n     - a (number) start _slave_ number\n     - A (number) end _slave_ number\n     - b (number) start _master_ number (start time in general case)\n     - B (number) end _master_ number (end time in gereal case)\n     - get (function) getter of _master_ number (see @mina.time)\n     - set (function) setter of _slave_ number\n     - easing (function) #optional easing function, default is @mina.linear\n     = (object) animation descriptor\n     o {\n     o         id (string) animation id,\n     o         start (number) start _slave_ number,\n     o         end (number) end _slave_ number,\n     o         b (number) start _master_ number,\n     o         s (number) animation status (0..1),\n     o         dur (number) animation duration,\n     o         spd (number) animation speed,\n     o         get (function) getter of _master_ number (see @mina.time),\n     o         set (function) setter of _slave_ number,\n     o         easing (function) easing function, default is @mina.linear,\n     o         status (function) status getter/setter,\n     o         speed (function) speed getter/setter,\n     o         duration (function) duration getter/setter,\n     o         stop (function) animation stopper\n     o }\n    \\*/\n    mina = function (a, A, b, B, get, set, easing) {\n        var anim = {\n            id: ID(),\n            start: a,\n            end: A,\n            b: b,\n            s: 0,\n            dur: B - b,\n            spd: 1,\n            get: get,\n            set: set,\n            easing: easing || mina.linear,\n            status: sta,\n            speed: speed,\n            duration: duration,\n            stop: stopit,\n            pause: pause,\n            resume: resume\n        };\n        animations[anim.id] = anim;\n        var len = 0, i;\n        for (i in animations) if (animations.hasOwnProperty(i)) {\n            len++;\n            if (len == 2) {\n                break;\n            }\n        }\n        len == 1 && requestAnimFrame(frame);\n        return anim;\n    };\n    /*\\\n     * mina.time\n     [ method ]\n     **\n     * Returns the current time. Equivalent to:\n     | function () {\n     |     return (new Date).getTime();\n     | }\n    \\*/\n    mina.time = timer;\n    /*\\\n     * mina.getById\n     [ method ]\n     **\n     * Returns an animation by its id\n     - id (string) animation's id\n     = (object) See @mina\n    \\*/\n    mina.getById = function (id) {\n        return animations[id] || null;\n    };\n\n    /*\\\n     * mina.linear\n     [ method ]\n     **\n     * Default linear easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.linear = function (n) {\n        return n;\n    };\n    /*\\\n     * mina.easeout\n     [ method ]\n     **\n     * Easeout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeout = function (n) {\n        return Math.pow(n, 1.7);\n    };\n    /*\\\n     * mina.easein\n     [ method ]\n     **\n     * Easein easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easein = function (n) {\n        return Math.pow(n, .48);\n    };\n    /*\\\n     * mina.easeinout\n     [ method ]\n     **\n     * Easeinout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeinout = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        if (n == 0) {\n            return 0;\n        }\n        var q = .48 - n / 1.04,\n            Q = Math.sqrt(.1734 + q * q),\n            x = Q - q,\n            X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n            y = -Q - q,\n            Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n            t = X + Y + .5;\n        return (1 - t) * 3 * t * t + t * t * t;\n    };\n    /*\\\n     * mina.backin\n     [ method ]\n     **\n     * Backin easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backin = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        var s = 1.70158;\n        return n * n * ((s + 1) * n - s);\n    };\n    /*\\\n     * mina.backout\n     [ method ]\n     **\n     * Backout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backout = function (n) {\n        if (n == 0) {\n            return 0;\n        }\n        n = n - 1;\n        var s = 1.70158;\n        return n * n * ((s + 1) * n + s) + 1;\n    };\n    /*\\\n     * mina.elastic\n     [ method ]\n     **\n     * Elastic easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.elastic = function (n) {\n        if (n == !!n) {\n            return n;\n        }\n        return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n            (2 * Math.PI) / .3) + 1;\n    };\n    /*\\\n     * mina.bounce\n     [ method ]\n     **\n     * Bounce easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.bounce = function (n) {\n        var s = 7.5625,\n            p = 2.75,\n            l;\n        if (n < (1 / p)) {\n            l = s * n * n;\n        } else {\n            if (n < (2 / p)) {\n                n -= (1.5 / p);\n                l = s * n * n + .75;\n            } else {\n                if (n < (2.5 / p)) {\n                    n -= (2.25 / p);\n                    l = s * n * n + .9375;\n                } else {\n                    n -= (2.625 / p);\n                    l = s * n * n + .984375;\n                }\n            }\n        }\n        return l;\n    };\n    window.mina = mina;\n    return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function() {\nSnap.version = \"0.2.0\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n    if (w) {\n        if (w.tagName) {\n            return wrap(w);\n        }\n        if (w instanceof Element) {\n            return w;\n        }\n        if (h == null) {\n            w = glob.doc.querySelector(w);\n            return wrap(w);\n        }\n    }\n    w = w == null ? \"100%\" : w;\n    h = h == null ? \"100%\" : h;\n    return new Paper(w, h);\n}\nSnap.toString = function () {\n    return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n    win: window,\n    doc: window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n    Str = String,\n    toFloat = parseFloat,\n    toInt = parseInt,\n    math = Math,\n    mmax = math.max,\n    mmin = math.min,\n    abs = math.abs,\n    pow = math.pow,\n    PI = math.PI,\n    round = math.round,\n    E = \"\",\n    S = \" \",\n    objectToString = Object.prototype.toString,\n    ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n    colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n    bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n    reURLValue = /^url\\(#?([^)]+)\\)$/,\n    spaces = \"\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\",\n    separator = new RegExp(\"[,\" + spaces + \"]+\"),\n    whitespace = new RegExp(\"[\" + spaces + \"]\", \"g\"),\n    commaSpaces = new RegExp(\"[\" + spaces + \"]*,[\" + spaces + \"]*\"),\n    hsrg = {hs: 1, rg: 1},\n    pathCommand = new RegExp(\"([a-z])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    tCommand = new RegExp(\"([rstm])[\" + spaces + \",]*((-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?[\" + spaces + \"]*,?[\" + spaces + \"]*)+)\", \"ig\"),\n    pathValues = new RegExp(\"(-?\\\\d*\\\\.?\\\\d*(?:e[\\\\-+]?\\\\d+)?)[\" + spaces + \"]*,?[\" + spaces + \"]*\", \"ig\"),\n    idgen = 0,\n    idprefix = \"S\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    xlink = \"http://www.w3.org/1999/xlink\",\n    xmlns = \"http://www.w3.org/2000/svg\",\n    hub = {},\n    URL = Snap.url = function (url) {\n        return \"url('#\" + url + \"')\";\n    };\n\nfunction $(el, attr) {\n    if (attr) {\n        if (typeof el == \"string\") {\n            el = $(el);\n        }\n        if (typeof attr == \"string\") {\n            if (attr.substring(0, 6) == \"xlink:\") {\n                return el.getAttributeNS(xlink, attr.substring(6));\n            }\n            if (attr.substring(0, 4) == \"xml:\") {\n                return el.getAttributeNS(xmlns, attr.substring(4));\n            }\n            return el.getAttribute(attr);\n        }\n        for (var key in attr) if (attr[has](key)) {\n            var val = Str(attr[key]);\n            if (val) {\n                if (key.substring(0, 6) == \"xlink:\") {\n                    el.setAttributeNS(xlink, key.substring(6), val);\n                } else if (key.substring(0, 4) == \"xml:\") {\n                    el.setAttributeNS(xmlns, key.substring(4), val);\n                } else {\n                    el.setAttribute(key, val);\n                }\n            } else {\n                el.removeAttribute(key);\n            }\n        }\n    } else {\n        el = glob.doc.createElementNS(xmlns, el);\n        // el.style && (el.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\");\n    }\n    return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n    var attrs = el.attributes,\n        name,\n        out = {};\n    for (var i = 0; i < attrs.length; i++) {\n        if (attrs[i].namespaceURI == xlink) {\n            name = \"xlink:\";\n        } else {\n            name = \"\";\n        }\n        name += attrs[i].name;\n        out[name] = attrs[i].textContent;\n    }\n    return out;\n}\nfunction is(o, type) {\n    type = Str.prototype.toLowerCase.call(type);\n    if (type == \"finite\") {\n        return isFinite(o);\n    }\n    if (type == \"array\" &&\n        (o instanceof Array || Array.isArray && Array.isArray(o))) {\n        return true;\n    }\n    return  (type == \"null\" && o === null) ||\n            (type == typeof o && o !== null) ||\n            (type == \"object\" && o === Object(o)) ||\n            objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{<name>}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n |     x: 10,\n |     y: 20,\n |     dim: {\n |         width: 40,\n |         height: 50,\n |         \"negative width\": -40\n |     }\n | }));\n\\*/\nSnap.format = (function () {\n    var tokenRegex = /\\{([^\\}]+)\\}/g,\n        objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n        replacer = function (all, key, obj) {\n            var res = obj;\n            key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                name = name || quotedName;\n                if (res) {\n                    if (name in res) {\n                        res = res[name];\n                    }\n                    typeof res == \"function\" && isFunc && (res = res());\n                }\n            });\n            res = (res == null || res == obj ? all : res) + \"\";\n            return res;\n        };\n    return function (str, obj) {\n        return Str(str).replace(tokenRegex, function (all, key) {\n            return replacer(all, key, obj);\n        });\n    };\n})();\nvar preload = (function () {\n    function onerror() {\n        this.parentNode.removeChild(this);\n    }\n    return function (src, f) {\n        var img = glob.doc.createElement(\"img\"),\n            body = glob.doc.body;\n        img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n        img.onload = function () {\n            f.call(img);\n            img.onload = img.onerror = null;\n            body.removeChild(img);\n        };\n        img.onerror = onerror;\n        body.appendChild(img);\n        img.src = src;\n    };\n}());\nfunction clone(obj) {\n    if (typeof obj == \"function\" || Object(obj) !== obj) {\n        return obj;\n    }\n    var res = new obj.constructor;\n    for (var key in obj) if (obj[has](key)) {\n        res[key] = clone(obj[key]);\n    }\n    return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n        return array.push(array.splice(i, 1)[0]);\n    }\n}\nfunction cacher(f, scope, postprocessor) {\n    function newf() {\n        var arg = Array.prototype.slice.call(arguments, 0),\n            args = arg.join(\"\\u2400\"),\n            cache = newf.cache = newf.cache || {},\n            count = newf.count = newf.count || [];\n        if (cache[has](args)) {\n            repush(count, args);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        count.length >= 1e3 && delete cache[count.shift()];\n        count.push(args);\n        cache[args] = f.apply(scope, arg);\n        return postprocessor ? postprocessor(cache[args]) : cache[args];\n    }\n    return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n    if (x3 == null) {\n        var x = x1 - x2,\n            y = y1 - y2;\n        if (!x && !y) {\n            return 0;\n        }\n        return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n    } else {\n        return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n    }\n}\nfunction rad(deg) {\n    return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n    return rad * 180 / PI % 360;\n}\nfunction x_y() {\n    return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n    return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n// SIERRA for which point is the angle calculated?\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n > Parameters\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n    tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n    if (is(values, \"array\")) {\n        var i = values.length;\n        while (i--) if (abs(values[i] - value) <= tolerance) {\n            return values[i];\n        }\n    } else {\n        values = +values;\n        var rem = value % values;\n        if (rem < tolerance) {\n            return value - rem;\n        }\n        if (rem > values - tolerance) {\n            return value - rem + values;\n        }\n    }\n    return value;\n};\n\n// MATRIX\nfunction Matrix(a, b, c, d, e, f) {\n    if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n        this.a = a.a;\n        this.b = a.b;\n        this.c = a.c;\n        this.d = a.d;\n        this.e = a.e;\n        this.f = a.f;\n        return;\n    }\n    if (a != null) {\n        this.a = +a;\n        this.b = +b;\n        this.c = +c;\n        this.d = +d;\n        this.e = +e;\n        this.f = +f;\n    } else {\n        this.a = 1;\n        this.b = 0;\n        this.c = 0;\n        this.d = 1;\n        this.e = 0;\n        this.f = 0;\n    }\n}\n(function (matrixproto) {\n    /*\\\n     * Matrix.add\n     [ method ]\n     **\n     * Adds the given matrix to existing one\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     * or\n     - matrix (object) @Matrix\n    \\*/\n    matrixproto.add = function (a, b, c, d, e, f) {\n        var out = [[], [], []],\n            m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],\n            matrix = [[a, c, e], [b, d, f], [0, 0, 1]],\n            x, y, z, res;\n\n        if (a && a instanceof Matrix) {\n            matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];\n        }\n\n        for (x = 0; x < 3; x++) {\n            for (y = 0; y < 3; y++) {\n                res = 0;\n                for (z = 0; z < 3; z++) {\n                    res += m[x][z] * matrix[z][y];\n                }\n                out[x][y] = res;\n            }\n        }\n        this.a = out[0][0];\n        this.b = out[1][0];\n        this.c = out[0][1];\n        this.d = out[1][1];\n        this.e = out[0][2];\n        this.f = out[1][2];\n        return this;\n    };\n    /*\\\n     * Matrix.invert\n     [ method ]\n     **\n     * Returns an inverted version of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.invert = function () {\n        var me = this,\n            x = me.a * me.d - me.b * me.c;\n        return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n    };\n    /*\\\n     * Matrix.clone\n     [ method ]\n     **\n     * Returns a copy of the matrix\n     = (object) @Matrix\n    \\*/\n    matrixproto.clone = function () {\n        return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n    };\n    /*\\\n     * Matrix.translate\n     [ method ]\n     **\n     * Translate the matrix\n     - x (number) horizontal offset distance\n     - y (number) vertical offset distance\n    \\*/\n    matrixproto.translate = function (x, y) {\n        return this.add(1, 0, 0, 1, x, y);\n    };\n    /*\\\n     * Matrix.scale\n     [ method ]\n     **\n     * Scales the matrix\n     - x (number) amount to be scaled, with `1` resulting in no change\n     - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n     - cx (number) #optional horizontal origin point from which to scale\n     - cy (number) #optional vertical origin point from which to scale\n     * Default cx, cy is the middle point of the element.\n    \\*/\n    matrixproto.scale = function (x, y, cx, cy) {\n        y == null && (y = x);\n        (cx || cy) && this.add(1, 0, 0, 1, cx, cy);\n        this.add(x, 0, 0, y, 0, 0);\n        (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);\n        return this;\n    };\n    /*\\\n     * Matrix.rotate\n     [ method ]\n     **\n     * Rotates the matrix\n     - a (number) angle of rotation, in degrees\n     - x (number) horizontal origin point from which to rotate\n     - y (number) vertical origin point from which to rotate\n    \\*/\n    matrixproto.rotate = function (a, x, y) {\n        a = rad(a);\n        x = x || 0;\n        y = y || 0;\n        var cos = +math.cos(a).toFixed(9),\n            sin = +math.sin(a).toFixed(9);\n        this.add(cos, sin, -sin, cos, x, y);\n        return this.add(1, 0, 0, 1, -x, -y);\n    };\n    /*\\\n     * Matrix.x\n     [ method ]\n     **\n     * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n     - x (number)\n     - y (number)\n     = (number) x\n    \\*/\n    matrixproto.x = function (x, y) {\n        return x * this.a + y * this.c + this.e;\n    };\n    /*\\\n     * Matrix.y\n     [ method ]\n     **\n     * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n     - x (number)\n     - y (number)\n     = (number) y\n    \\*/\n    matrixproto.y = function (x, y) {\n        return x * this.b + y * this.d + this.f;\n    };\n    matrixproto.get = function (i) {\n        return +this[Str.fromCharCode(97 + i)].toFixed(4);\n    };\n    matrixproto.toString = function () {\n        return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n    };\n    matrixproto.offset = function () {\n        return [this.e.toFixed(4), this.f.toFixed(4)];\n    };\n    function norm(a) {\n        return a[0] * a[0] + a[1] * a[1];\n    }\n    function normalize(a) {\n        var mag = math.sqrt(norm(a));\n        a[0] && (a[0] /= mag);\n        a[1] && (a[1] /= mag);\n    }\n    /*\\\n     * Matrix.split\n     [ method ]\n     **\n     * Splits matrix into primitive transformations\n     = (object) in format:\n     o dx (number) translation by x\n     o dy (number) translation by y\n     o scalex (number) scale by x\n     o scaley (number) scale by y\n     o shear (number) shear\n     o rotate (number) rotation in deg\n     o isSimple (boolean) could it be represented via simple transformations\n    \\*/\n    matrixproto.split = function () {\n        var out = {};\n        // translation\n        out.dx = this.e;\n        out.dy = this.f;\n\n        // scale and shear\n        var row = [[this.a, this.c], [this.b, this.d]];\n        out.scalex = math.sqrt(norm(row[0]));\n        normalize(row[0]);\n\n        out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n        row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n        out.scaley = math.sqrt(norm(row[1]));\n        normalize(row[1]);\n        out.shear /= out.scaley;\n\n        // rotation\n        var sin = -row[0][1],\n            cos = row[1][1];\n        if (cos < 0) {\n            out.rotate = deg(math.acos(cos));\n            if (sin < 0) {\n                out.rotate = 360 - out.rotate;\n            }\n        } else {\n            out.rotate = deg(math.asin(sin));\n        }\n\n        out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n        out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n        out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n        return out;\n    };\n    /*\\\n     * Matrix.toTransformString\n     [ method ]\n     **\n     * Returns transform string that represents given matrix\n     = (string) transform string\n    \\*/\n    matrixproto.toTransformString = function (shorter) {\n        var s = shorter || this.split();\n        if (s.isSimple) {\n            s.scalex = +s.scalex.toFixed(4);\n            s.scaley = +s.scaley.toFixed(4);\n            s.rotate = +s.rotate.toFixed(4);\n            return  (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) + \n                    (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E) +\n                    (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E);\n        } else {\n            return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n        }\n    };\n})(Matrix.prototype);\n/*\\\n * Snap.Matrix\n [ method ]\n **\n * Utility method\n **\n * Returns a matrix based on the given parameters\n - a (number)\n - b (number)\n - c (number)\n - d (number)\n - e (number)\n - f (number)\n * or\n - svgMatrix (SVGMatrix)\n = (object) @Matrix\n\\*/\nSnap.Matrix = Matrix;\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n # <ul>\n #     <li>Color name (<code>red</code>, <code>green</code>, <code>cornflowerblue</code>, etc)</li>\n #     <li>#••• — shortened HTML color: (<code>#000</code>, <code>#fc0</code>, etc.)</li>\n #     <li>#•••••• — full length HTML color: (<code>#000000</code>, <code>#bd2300</code>)</li>\n #     <li>rgb(•••, •••, •••) — red, green and blue channels values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n #     <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n #     <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n #     <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsl(•••, •••, •••) — hue, saturation and luminosity values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n #     <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n # </ul>\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n    if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    if (colour == \"none\") {\n        return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n    }\n    !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n    if (!colour) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    var res,\n        red,\n        green,\n        blue,\n        opacity,\n        t,\n        values,\n        rgb = colour.match(colourRegExp);\n    if (rgb) {\n        if (rgb[2]) {\n            blue = toInt(rgb[2].substring(5), 16);\n            green = toInt(rgb[2].substring(3, 5), 16);\n            red = toInt(rgb[2].substring(1, 3), 16);\n        }\n        if (rgb[3]) {\n            blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n            green = toInt((t = rgb[3].charAt(2)) + t, 16);\n            red = toInt((t = rgb[3].charAt(1)) + t, 16);\n        }\n        if (rgb[4]) {\n            values = rgb[4].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red *= 2.55);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green *= 2.55);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue *= 2.55);\n            rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n        }\n        if (rgb[5]) {\n            values = rgb[5].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsb2rgb(red, green, blue, opacity);\n        }\n        if (rgb[6]) {\n            values = rgb[6].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsl2rgb(red, green, blue, opacity);\n        }\n        red = mmin(math.round(red), 255);\n        green = mmin(math.round(green), 255);\n        blue = mmin(math.round(blue), 255);\n        opacity = mmin(mmax(opacity, 0), 1);\n        rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n        rgb.hex = \"#\" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);\n        rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n        return rgb;\n    }\n    return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n// SIERRA It seems odd that the following 3 conversion methods are not expressed as .this2that(), like the others.\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n    return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n    return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n    if (is(o, \"finite\")) {\n        var round = math.round;\n        return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n    }\n    return \"#\" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);\n});\nvar toHex = function (color) {\n    var i = glob.doc.getElementsByTagName(\"head\")[0],\n        red = \"rgb(255, 0, 0)\";\n    toHex = cacher(function (color) {\n        if (color.toLowerCase() == \"red\") {\n            return red;\n        }\n        i.style.color = red;\n        i.style.color = color;\n        var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n        return out == red ? null : out;\n    });\n    return toHex(color);\n},\nhsbtoString = function () {\n    return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n    return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n    return this.opacity == 1 || this.opacity == null ?\n            this.hex :\n            \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n    if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n        b = r.b;\n        g = r.g;\n        r = r.r;\n    }\n    if (g == null && is(r, string)) {\n        var clr = Snap.getRGB(r);\n        r = clr.r;\n        g = clr.g;\n        b = clr.b;\n    }\n    if (r > 1 || g > 1 || b > 1) {\n        r /= 255;\n        g /= 255;\n        b /= 255;\n    }\n    \n    return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n    r = math.round(r * 255);\n    g = math.round(g * 255);\n    b = math.round(b * 255);\n    var rgb = {\n        r: r,\n        g: g,\n        b: b,\n        opacity: is(o, \"finite\") ? o : 1,\n        hex: Snap.rgb(r, g, b),\n        toString: rgbtoString\n    };\n    is(o, \"finite\") && (rgb.opacity = o);\n    return rgb;\n};\n// SIERRA Clarify if Snap does not support consolidated HSLA/RGBA colors. E.g., can you specify a semi-transparent value for Snap.filter.shadow()?\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) `true` if string can't be parsed,\n o     h (number) hue,\n o     s (number) saturation,\n o     v (number) value (brightness),\n o     l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n    var rgb;\n    if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n        rgb = Snap.hsb2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n        rgb = Snap.hsl2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else {\n        if (is(clr, \"string\")) {\n            clr = Snap.getRGB(clr);\n        }\n        if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n            rgb = Snap.rgb2hsl(clr);\n            clr.h = rgb.h;\n            clr.s = rgb.s;\n            clr.l = rgb.l;\n            rgb = Snap.rgb2hsb(clr);\n            clr.v = rgb.b;\n        } else {\n            clr = {hex: \"none\"};\n            clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            clr.error = 1;\n        }\n    }\n    clr.toString = rgbtoString;\n    return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n        v = h.b;\n        s = h.s;\n        h = h.h;\n        o = h.o;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = v * s;\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = v - C;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n        l = h.l;\n        s = h.s;\n        h = h.h;\n    }\n    if (h > 1 || s > 1 || l > 1) {\n        h /= 360;\n        s /= 100;\n        l /= 100;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = (h % 360) / 60;\n    C = 2 * s * (l < .5 ? l : 1 - l);\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = l - C / 2;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, V, C;\n    V = mmax(r, g, b);\n    C = V - mmin(r, g, b);\n    H = (C == 0 ? null :\n         V == r ? (g - b) / C :\n         V == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4\n        );\n    H = ((H + 360) % 6) * 60 / 360;\n    S = C == 0 ? 0 : C / V;\n    return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, L, M, m, C;\n    M = mmax(r, g, b);\n    m = mmin(r, g, b);\n    C = M - m;\n    H = (C == 0 ? null :\n         M == r ? (g - b) / C :\n         M == g ? (b - r) / C + 2 :\n                  (r - g) / C + 4);\n    H = ((H + 360) % 6) * 60 / 360;\n    L = (M + m) / 2;\n    S = (C == 0 ? 0 :\n         L < .5 ? C / (2 * L) :\n                  C / (2 - 2 * L));\n    return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n// SIERRA Snap.parsePathString(): By _array of arrays,_ I assume you mean a format like this for two separate segments? [ [\"M10,10\",\"L90,90\"], [\"M90,10\",\"L10,90\"] ] Otherwise how is each command structured?\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n    if (!pathString) {\n        return null;\n    }\n    var pth = Snap.path(pathString);\n    if (pth.arr) {\n        return Snap.path.clone(pth.arr);\n    }\n    \n    var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n        data = [];\n    if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(pathString);\n    }\n    if (!data.length) {\n        Str(pathString).replace(pathCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            if (name == \"m\" && params.length > 2) {\n                data.push([b].concat(params.splice(0, 2)));\n                name = \"l\";\n                b = b == \"m\" ? \"l\" : \"L\";\n            }\n            if (name == \"o\" && params.length == 1) {\n                data.push([b, params[0]]);\n            }\n            if (name == \"r\") {\n                data.push([b].concat(params));\n            } else while (params.length >= paramCounts[name]) {\n                data.push([b].concat(params.splice(0, paramCounts[name])));\n                if (!paramCounts[name]) {\n                    break;\n                }\n            }\n        });\n    }\n    data.toString = Snap.path.toString;\n    pth.arr = Snap.path.clone(data);\n    return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n    if (!TString) {\n        return null;\n    }\n    var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n        data = [];\n    if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(TString);\n    }\n    if (!data.length) {\n        Str(TString).replace(tCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            data.push([b].concat(params));\n        });\n    }\n    data.toString = Snap.path.toString;\n    return data;\n};\nfunction svgTransform2string(tstr) {\n    var res = [];\n    tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n        params = params.split(/\\s*,\\s*|\\s+/);\n        if (name == \"rotate\" && params.length == 1) {\n            params.push(0, 0);\n        }\n        if (name == \"scale\") {\n            if (params.length == 2) {\n                params.push(0, 0);\n            }\n            if (params.length == 1) {\n                params.push(params[0], 0, 0);\n            }\n        }\n        if (name == \"skewX\") {\n            res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n        } else if (name == \"skewY\") {\n            res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n        } else {\n            res.push([name.charAt(0)].concat(params));\n        }\n        return all;\n    });\n    return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = new RegExp(\"^[a-z][\" + spaces + \"]*-?\\\\.?\\\\d\", \"i\");\nfunction transform2matrix(tstr, bbox) {\n    var tdata = parseTransformString(tstr),\n        m = new Matrix;\n    if (tdata) {\n        for (var i = 0, ii = tdata.length; i < ii; i++) {\n            var t = tdata[i],\n                tlen = t.length,\n                command = Str(t[0]).toLowerCase(),\n                absolute = t[0] != command,\n                inver = absolute ? m.invert() : 0,\n                x1,\n                y1,\n                x2,\n                y2,\n                bb;\n            if (command == \"t\" && tlen == 2){\n                m.translate(t[1], 0);\n            } else if (command == \"t\" && tlen == 3) {\n                if (absolute) {\n                    x1 = inver.x(0, 0);\n                    y1 = inver.y(0, 0);\n                    x2 = inver.x(t[1], t[2]);\n                    y2 = inver.y(t[1], t[2]);\n                    m.translate(x2 - x1, y2 - y1);\n                } else {\n                    m.translate(t[1], t[2]);\n                }\n            } else if (command == \"r\") {\n                if (tlen == 2) {\n                    bb = bb || bbox;\n                    m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.rotate(t[1], x2, y2);\n                    } else {\n                        m.rotate(t[1], t[2], t[3]);\n                    }\n                }\n            } else if (command == \"s\") {\n                if (tlen == 2 || tlen == 3) {\n                    bb = bb || bbox;\n                    m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.scale(t[1], t[1], x2, y2);\n                    } else {\n                        m.scale(t[1], t[1], t[2], t[3]);\n                    }\n                } else if (tlen == 5) {\n                    if (absolute) {\n                        x2 = inver.x(t[3], t[4]);\n                        y2 = inver.y(t[3], t[4]);\n                        m.scale(t[1], t[2], x2, y2);\n                    } else {\n                        m.scale(t[1], t[2], t[3], t[4]);\n                    }\n                }\n            } else if (command == \"m\" && tlen == 7) {\n                m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n            }\n        }\n    }\n    return m;\n}\nSnap._.transform2matrix = transform2matrix;\nfunction extractTransform(el, tstr) {\n    if (tstr == null) {\n        var doReturn = true;\n        if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n            tstr = el.node.getAttribute(\"gradientTransform\");\n        } else if (el.type == \"pattern\") {\n            tstr = el.node.getAttribute(\"patternTransform\");\n        } else {\n            tstr = el.node.getAttribute(\"transform\");\n        }\n        if (!tstr) {\n            return new Matrix;\n        }\n        tstr = svgTransform2string(tstr);\n    } else {\n        if (!Snap._.rgTransform.test(tstr)) {\n            tstr = svgTransform2string(tstr);\n        } else {\n            tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || E);\n        }\n        if (is(tstr, \"array\")) {\n            tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n        }\n        el._.transform = tstr;\n    }\n    var m = transform2matrix(tstr, el.getBBox(1));\n    if (doReturn) {\n        return m;\n    } else {\n        el.matrix = m;\n    }\n}\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n    function (a, b) {\n        var adown = a.nodeType == 9 ? a.documentElement : a,\n            bup = b && b.parentNode;\n            return a == bup || !!(bup && bup.nodeType == 1 && (\n                adown.contains ?\n                    adown.contains(bup) :\n                    a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n            ));\n    } :\n    function (a, b) {\n        if (b) {\n            while (b) {\n                b = b.parentNode;\n                if (b == a) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\nfunction getSomeDefs(el) {\n    var cache = Snap._.someDefs;\n    if (cache && contains(cache.ownerDocument.documentElement, cache)) {\n        return cache;\n    }\n    var p = (el.node.ownerSVGElement && wrap(el.node.ownerSVGElement)) ||\n            (el.node.parentNode && wrap(el.node.parentNode)) ||\n            Snap.select(\"svg\") ||\n            Snap(0, 0),\n        pdefs = p.select(\"defs\"),\n        defs  = pdefs == null ? false : pdefs.node;\n    if (!defs) {\n        defs = make(\"defs\", p.node).node;\n    }\n    Snap._.someDefs = defs;\n    return defs;\n}\nSnap._.getSomeDefs = getSomeDefs;\nfunction unit2px(el, name, value) {\n    var defs = getSomeDefs(el),\n        out = {},\n        mgr = defs.querySelector(\".svg---mgr\");\n    if (!mgr) {\n        mgr = $(\"rect\");\n        $(mgr, {width: 10, height: 10, \"class\": \"svg---mgr\"});\n        defs.appendChild(mgr);\n    }\n    function getW(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {width: val});\n        return mgr.getBBox().width;\n    }\n    function getH(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {height: val});\n        return mgr.getBBox().height;\n    }\n    function set(nam, f) {\n        if (name == null) {\n            out[nam] = f(el.attr(nam));\n        } else if (nam == name) {\n            out = f(value == null ? el.attr(nam) : value);\n        }\n    }\n    switch (el.type) {\n        case \"rect\":\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        case \"image\":\n            set(\"width\", getW);\n            set(\"height\", getH);\n        case \"text\":\n            set(\"x\", getW);\n            set(\"y\", getH);\n        break;\n        case \"circle\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"r\", getW);\n        break;\n        case \"ellipse\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        break;\n        case \"line\":\n            set(\"x1\", getW);\n            set(\"x2\", getW);\n            set(\"y1\", getH);\n            set(\"y2\", getH);\n        break;\n        case \"marker\":\n            set(\"refX\", getW);\n            set(\"markerWidth\", getW);\n            set(\"refY\", getH);\n            set(\"markerHeight\", getH);\n        break;\n        case \"radialGradient\":\n            set(\"fx\", getW);\n            set(\"fy\", getH);\n        break;\n        case \"tspan\":\n            set(\"dx\", getW);\n            set(\"dy\", getH);\n        break;\n        default:\n            set(name, getW);\n    }\n    return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n    return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n    var nodelist = glob.doc.querySelectorAll(query),\n        set = (Snap.set || Array)();\n    for (var i = 0; i < nodelist.length; i++) {\n        set.push(wrap(nodelist[i]));\n    }\n    return set;\n};\n\nfunction add2group(list) {\n    if (!is(list, \"array\")) {\n        list = Array.prototype.slice.call(arguments, 0);\n    }\n    var i = 0,\n        j = 0,\n        node = this.node;\n    while (this[i]) delete this[i++];\n    for (i = 0; i < list.length; i++) {\n        if (list[i].type == \"set\") {\n            list[i].forEach(function (el) {\n                node.appendChild(el.node);\n            });\n        } else {\n            node.appendChild(list[i].node);\n        }\n    }\n    var children = node.childNodes;\n    for (i = 0; i < children.length; i++) {\n        this[j++] = wrap(children[i]);\n    }\n    return this;\n}\nfunction Element(el) {\n    if (el.snap in hub) {\n        return hub[el.snap];\n    }\n    var id = this.id = ID(),\n        svg;\n    try {\n        svg = el.ownerSVGElement;\n    } catch(e) {}\n    this.node = el;\n    if (svg) {\n        this.paper = new Paper(svg);\n    }\n    this.type = el.tagName;\n    this.anims = {};\n    this._ = {\n        transform: []\n    };\n    el.snap = id;\n    hub[id] = this;\n    if (this.type == \"g\") {\n        this.add = add2group;\n        for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n            this[method] = Paper.prototype[method];\n        }\n    }\n}\nfunction arrayFirstValue(arr) {\n    var res;\n    for (var i = 0, ii = arr.length; i < ii; i++) {\n        res = res || arr[i];\n        if (res) {\n            return res;\n        }\n    }\n}\n(function (elproto) {\n    /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Gets or sets given attributes of the element\n     **\n     - params (object) contains key-value pairs of attributes you want to set\n     * or\n     - param (string) name of the attribute\n     = (Element) the current element\n     * or\n     = (string) value of attribute\n     > Usage\n     | el.attr({\n     |     fill: \"#fc0\",\n     |     stroke: \"#000\",\n     |     strokeWidth: 2, // CamelCase...\n     |     \"fill-opacity\": 0.5 // or dash-separated names\n     | });\n     | console.log(el.attr(\"fill\")); // #fc0\n    \\*/\n    elproto.attr = function (params, value) {\n        var el = this,\n            node = el.node;\n        if (!params) {\n            return el;\n        }\n        if (is(params, \"string\")) {\n            if (arguments.length > 1) {\n                var json = {};\n                json[params] = value;\n                params = json;\n            } else {\n                return arrayFirstValue(eve(\"snap.util.getattr.\"+params, el));\n            }\n        }\n        for (var att in params) {\n            if (params[has](att)) {\n                eve(\"snap.util.attr.\" + att, el, params[att]);\n            }\n        }\n        return el;\n    };\n// SIERRA Element.getBBox(): Unclear why you would want to express the dimension of the box as a path.\n// SIERRA Element.getBBox(): Unclear why you would want to use r0/r1/r2. Also, basic definitions: wouldn't the _smallest circle that can be enclosed_ be a zero-radius point?\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Returns the bounding box descriptor for the given element\n     **\n     = (object) bounding box descriptor:\n     o {\n     o     cx: (number) x of the center,\n     o     cy: (number) x of the center,\n     o     h: (number) height,\n     o     height: (number) height,\n     o     path: (string) path command for the box,\n     o     r0: (number) radius of a circle that fully encloses the box,\n     o     r1: (number) radius of the smallest circle that can be enclosed,\n     o     r2: (number) radius of the largest circle that can be enclosed,\n     o     vb: (string) box as a viewbox command,\n     o     w: (number) width,\n     o     width: (number) width,\n     o     x2: (number) x of the right side,\n     o     x: (number) x of the left side,\n     o     y2: (number) y of the bottom edge,\n     o     y: (number) y of the top edge\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        var el = this;\n        if (el.type == \"use\") {\n            el = el.original;\n        }\n        if (el.removed) {\n            return {};\n        }\n        var _ = el._;\n        if (isWithoutTransform) {\n            _.bboxwt = Snap.path.get[el.type] ? Snap.path.getBBox(el.realPath = Snap.path.get[el.type](el)) : Snap._.box(el.node.getBBox());\n            return Snap._.box(_.bboxwt);\n        } else {\n            el.realPath = (Snap.path.get[el.type] || Snap.path.get.deflt)(el);\n            _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, el.matrix));\n        }\n        return Snap._.box(_.bbox);\n    };\n    var propString = function () {\n        return this.string;\n    };\n// SIERRA Element.transform(): seems to allow two return values, one of which (_Element_) is undefined.\n// SIERRA Element.transform(): if this only accepts one argument, it's unclear how it can both _get_ and _set_ a transform.\n// SIERRA Element.transform(): Unclear how Snap transform string format differs from SVG's.\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Gets or sets transformation of the element\n     **\n     - tstr (string) transform string in Snap or SVG format\n     = (Element) the current element\n     * or\n     = (object) transformation descriptor:\n     o {\n     o     string (string) transform string,\n     o     globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n     o     localMatrix (Matrix) matrix of transformations applied only to the element,\n     o     diffMatrix (Matrix) matrix of difference between global and local transformations,\n     o     global (string) global transformation as string,\n     o     local (string) local transformation as string,\n     o     toString (function) returns `string` property\n     o }\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            var global = new Matrix(this.node.getCTM()),\n                local = extractTransform(this),\n                localString = local.toTransformString(),\n                string = Str(local) == Str(this.matrix) ?\n                            _.transform : localString;\n            return {\n                string: string,\n                globalMatrix: global,\n                localMatrix: local,\n                diffMatrix: global.clone().add(local.invert()),\n                global: global.toTransformString(),\n                local: localString,\n                toString: propString\n            };\n        }\n        if (tstr instanceof Matrix) {\n            // may be need to apply it directly\n            // TODO: investigate\n            tstr = tstr.toTransformString();\n        }\n        extractTransform(this, tstr);\n\n        if (this.node) {\n            if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n                $(this.node, {gradientTransform: this.matrix});\n            } else if (this.type == \"pattern\") {\n                $(this.node, {patternTransform: this.matrix});\n            } else {\n                $(this.node, {transform: this.matrix});\n            }\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.parent\n     [ method ]\n     **\n     * Returns the element's parent\n     **\n     = (Element) the parent element\n    \\*/\n    elproto.parent = function () {\n        return wrap(this.node.parentNode);\n    };\n    /*\\\n     * Element.append\n     [ method ]\n     **\n     * Appends the given element to current one\n     **\n     - el (Element|Set) element to append\n     = (Element) the parent element\n    \\*/\n    /*\\\n     * Element.add\n     [ method ]\n     **\n     * See @Element.append\n    \\*/\n    elproto.append = elproto.add = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this;\n                el.forEach(function (el) {\n                    it.add(el);\n                });\n                return this;\n            }\n            el = wrap(el);\n            this.node.appendChild(el.node);\n            el.paper = this.paper;\n        }\n        return this;\n    };\n    /*\\\n     * Element.appendTo\n     [ method ]\n     **\n     * Appends the current element to the given one\n     **\n     - el (Element) parent element to append to\n     = (Element) the child element\n    \\*/\n    elproto.appendTo = function (el) {\n        if (el) {\n            el = wrap(el);\n            el.append(this);\n        }\n        return this;\n    };\n    /*\\\n     * Element.prepend\n     [ method ]\n     **\n     * Prepends the given element to the current one\n     **\n     - el (Element) element to prepend\n     = (Element) the parent element\n    \\*/\n    elproto.prepend = function (el) {\n        if (el) {\n            el = wrap(el);\n            var parent = el.parent();\n            this.node.insertBefore(el.node, this.node.firstChild);\n            this.add && this.add();\n            el.paper = this.paper;\n            this.parent() && this.parent().add();\n            parent && parent.add();\n        }\n        return this;\n    };\n    /*\\\n     * Element.prependTo\n     [ method ]\n     **\n     * Prepends the current element to the given one\n     **\n     - el (Element) parent element to prepend to\n     = (Element) the child element\n    \\*/\n    elproto.prependTo = function (el) {\n        el = wrap(el);\n        el.prepend(this);\n        return this;\n    };\n    /*\\\n     * Element.before\n     [ method ]\n     **\n     * Inserts given element before the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.before = function (el) {\n        if (el.type == \"set\") {\n            var it = this;\n            el.forEach(function (el) {\n                var parent = el.parent();\n                it.node.parentNode.insertBefore(el.node, it.node);\n                parent && parent.add();\n            });\n            this.parent().add();\n            return this;\n        }\n        el = wrap(el);\n        var parent = el.parent();\n        this.node.parentNode.insertBefore(el.node, this.node);\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.after\n     [ method ]\n     **\n     * Inserts given element after the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.after = function (el) {\n        el = wrap(el);\n        var parent = el.parent();\n        if (this.node.nextSibling) {\n            this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n        } else {\n            this.node.parentNode.appendChild(el.node);\n        }\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertBefore = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertAfter = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the DOM\n     = (Element) the detached element\n    \\*/\n    elproto.remove = function () {\n        var parent = this.parent();\n        this.node.parentNode && this.node.parentNode.removeChild(this.node);\n        delete this.paper;\n        this.removed = true;\n        parent && parent.add();\n        return this;\n    };\n    /*\\\n     * Element.select\n     [ method ]\n     **\n     * Gathers the nested @Element matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Element) result of query selection\n    \\*/\n    elproto.select = function (query) {\n        return wrap(this.node.querySelector(query));\n    };\n    /*\\\n     * Element.selectAll\n     [ method ]\n     **\n     * Gathers nested @Element objects matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Set|array) result of query selection\n    \\*/\n    elproto.selectAll = function (query) {\n        var nodelist = this.node.querySelectorAll(query),\n            set = (Snap.set || Array)();\n        for (var i = 0; i < nodelist.length; i++) {\n            set.push(wrap(nodelist[i]));\n        }\n        return set;\n    };\n    /*\\\n     * Element.asPX\n     [ method ]\n     **\n     * Returns given attribute of the element as a `px` value (not %, em, etc.)\n     **\n     - attr (string) attribute name\n     - value (string) #optional attribute value\n     = (Element) result of query selection\n    \\*/\n    elproto.asPX = function (attr, value) {\n        if (value == null) {\n            value = this.attr(attr);\n        }\n        return +unit2px(this, attr, value);\n    };\n    // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned <use> instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n    /*\\\n     * Element.use\n     [ method ]\n     **\n     * Creates a `<use>` element linked to the current element\n     **\n     = (Element) the `<use>` element\n    \\*/\n    elproto.use = function () {\n        var use,\n            id = this.node.id;\n        if (!id) {\n            id = this.id;\n            $(this.node, {\n                id: id\n            });\n        }\n        if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n            this.type == \"pattern\") {\n            use = make(this.type, this.node.parentNode);\n        } else {\n            use = make(\"use\", this.node.parentNode);\n        }\n        $(use.node, {\n            \"xlink:href\": \"#\" + id\n        });\n        use.original = this;\n        return use;\n    };\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     * Creates a clone of the element and inserts it after the element\n     **\n     = (Element) the clone\n    \\*/\n    function fixids(el) {\n        var els = el.selectAll(\"*\"),\n            it,\n            url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n            ids = [],\n            uses = {};\n        function urltest(it, name) {\n            var val = $(it.node, name);\n            val = val && val.match(url);\n            val = val && val[2];\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    var attr = {};\n                    attr[name] = URL(id);\n                    $(it.node, attr);\n                });\n            }\n        }\n        function linktest(it) {\n            var val = $(it.node, \"xlink:href\");\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    it.attr(\"xlink:href\", \"#\" + id);\n                });\n            }\n        }\n        for (var i = 0, ii = els.length; i < ii; i++) {\n            it = els[i];\n            urltest(it, \"fill\");\n            urltest(it, \"stroke\");\n            urltest(it, \"filter\");\n            urltest(it, \"mask\");\n            urltest(it, \"clip-path\");\n            linktest(it);\n            var oldid = $(it.node, \"id\");\n            if (oldid) {\n                $(it.node, {id: it.id});\n                ids.push({\n                    old: oldid,\n                    id: it.id\n                });\n            }\n        }\n        for (i = 0, ii = ids.length; i < ii; i++) {\n            var fs = uses[ids[i].old];\n            if (fs) {\n                for (var j = 0, jj = fs.length; j < jj; j++) {\n                    fs[j](ids[i].id);\n                }\n            }\n        }\n    }\n    elproto.clone = function () {\n        var clone = wrap(this.node.cloneNode(true));\n        if ($(clone.node, \"id\")) {\n            $(clone.node, {id: clone.id});\n        }\n        fixids(clone);\n        clone.insertAfter(this);\n        return clone;\n    };\n// SIERRA Element.toDefs(): If this _moves_ an element to the <defs> region, why is the return value a _clone_? Also unclear why it's called the _relative_ <defs> section. Perhaps _shared_?\n    /*\\\n     * Element.toDefs\n     [ method ]\n     **\n     * Moves element to the shared `<defs>` area\n     **\n     = (Element) the clone\n    \\*/\n    elproto.toDefs = function () {\n        var defs = getSomeDefs(this);\n        defs.appendChild(this.node);\n        return this;\n    };\n// SIERRA Element.pattern(): x/y/width/height data types are listed as both String and Number. Is that an error, or does it mean strings are coerced?\n// SIERRA Element.pattern(): clarify that x/y are offsets that e.g., may add gutters between the tiles.\n    /*\\\n     * Element.pattern\n     [ method ]\n     **\n     * Creates a `<pattern>` element from the current element\n     **\n     * To create a pattern you have to specify the pattern rect:\n     - x (string|number)\n     - y (string|number)\n     - width (string|number)\n     - height (string|number)\n     = (Element) the `<pattern>` element\n     * You can use pattern later on as an argument for `fill` attribute:\n     | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n     |         fill: \"none\",\n     |         stroke: \"#bada55\",\n     |         strokeWidth: 5\n     |     }).pattern(0, 0, 10, 10),\n     |     c = paper.circle(200, 200, 100);\n     | c.attr({\n     |     fill: p\n     | });\n    \\*/\n    elproto.pattern = function (x, y, width, height) {\n        var p = make(\"pattern\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        $(p.node, {\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            patternUnits: \"userSpaceOnUse\",\n            id: p.id,\n            viewBox: [x, y, width, height].join(\" \")\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values.  Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where?  Couldn't they also be assigned default values?\n    /*\\\n     * Element.marker\n     [ method ]\n     **\n     * Creates a `<marker>` element from the current element\n     **\n     * To create a marker you have to specify the bounding rect and reference point:\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - refX (number)\n     - refY (number)\n     = (Element) the `<marker>` element\n     * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n    \\*/\n    // TODO add usage for markers\n    elproto.marker = function (x, y, width, height, refX, refY) {\n        var p = make(\"marker\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            refX = x.refX || x.cx;\n            refY = x.refY || x.cy;\n            x = x.x;\n        }\n        $(p.node, {\n            viewBox: [x, y, width, height].join(S),\n            markerWidth: width,\n            markerHeight: height,\n            orient: \"auto\",\n            refX: refX || 0,\n            refY: refY || 0,\n            id: p.id\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n    // animation\n    function slice(from, to, f) {\n        return function (arr) {\n            var res = arr.slice(from, to);\n            if (res.length == 1) {\n                res = res[0];\n            }\n            return f ? f(res) : res;\n        };\n    }\n    var Animation = function (attr, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        this.attr = attr;\n        this.dur = ms;\n        easing && (this.easing = easing);\n        callback && (this.callback = callback);\n    };\n    // SIERRA All object methods should feature sample code. This is just one instance.\n    /*\\\n     * Snap.animation\n     [ method ]\n     **\n     * Creates an animation object\n     **\n     - attr (object) attributes of final destination\n     - duration (number) duration of the animation, in milliseconds\n     - easing (function) #optional one of easing functions of @mina or custom one\n     - callback (function) #optional callback function that fires when animation ends\n     = (object) animation object\n    \\*/\n    Snap.animation = function (attr, ms, easing, callback) {\n        return new Animation(attr, ms, easing, callback);\n    };\n    /*\\\n     * Element.inAnim\n     [ method ]\n     **\n     * Returns a set of animations that may be able to manipulate the current element\n     **\n     = (object) in format:\n     o {\n     o     anim (object) animation object,\n     o     curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    elproto.inAnim = function () {\n        var el = this,\n            res = [];\n        for (var id in el.anims) if (el.anims[has](id)) {\n            (function (a) {\n                res.push({\n                    anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n                    curStatus: a.status(),\n                    status: function (val) {\n                        return a.status(val);\n                    },\n                    stop: function () {\n                        a.stop();\n                    }\n                });\n            }(el.anims[id]));\n        }\n        return res;\n    };\n    /*\\\n     * Snap.animate\n     [ method ]\n     **\n     * Runs generic animation of one number into another with a caring function\n     **\n     - from (number|array) number or array of numbers\n     - to (number|array) number or array of numbers\n     - setter (function) caring function that accepts one number argument\n     - duration (number) duration, in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function to execute when animation ends\n     = (object) animation object in @mina format\n     o {\n     o     id (string) animation id, consider it read-only,\n     o     duration (function) gets or sets the duration of the animation,\n     o     easing (function) easing,\n     o     speed (function) gets or sets the speed of the animation,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n     | var rect = Snap().rect(0, 0, 10, 10);\n     | Snap.animate(0, 10, function (val) {\n     |     rect.attr({\n     |         x: val\n     |     });\n     | }, 1000);\n     | // in given context is equivalent to\n     | rect.animate({x: 10}, 1000);\n    \\*/\n    Snap.animate = function (from, to, setter, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        var now = mina.time(),\n            anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n        callback && eve.once(\"mina.finish.\" + anim.id, callback);\n        return anim;\n    };\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops all the animations for the current element\n     **\n     = (Element) the current element\n    \\*/\n    elproto.stop = function () {\n        var anims = this.inAnim();\n        for (var i = 0, ii = anims.length; i < ii; i++) {\n            anims[i].stop();\n        }\n        return this;\n    };\n    // SIERRA Element.animate(): For _attrs_, clarify if they represent the destination values, and if the animation executes relative to the element's current attribute values.\n    // SIERRA would a _custom_ animation function be an SVG keySplines value?\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Animates the given attributes of the element\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     = (Element) the current element\n    \\*/\n    elproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = easing.dur;\n            attrs = attrs.attr;\n        }\n        var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n            el = this;\n        for (var key in attrs) if (attrs[has](key)) {\n            if (el.equal) {\n                eq = el.equal(key, Str(attrs[key]));\n                from = eq.from;\n                to = eq.to;\n                f = eq.f;\n            } else {\n                from = +el.attr(key);\n                to = +attrs[key];\n            }\n            var len = is(from, \"array\") ? from.length : 1;\n            keys[key] = slice(fkeys.length, fkeys.length + len, f);\n            fkeys = fkeys.concat(from);\n            tkeys = tkeys.concat(to);\n        }\n        var now = mina.time(),\n            anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n                var attr = {};\n                for (var key in keys) if (keys[has](key)) {\n                    attr[key] = keys[key](val);\n                }\n                el.attr(attr);\n            }, easing);\n        el.anims[anim.id] = anim;\n        anim._attrs = attrs;\n        anim._callback = callback;\n        eve.once(\"mina.finish.\" + anim.id, function () {\n            delete el.anims[anim.id];\n            callback && callback.call(el);\n        });\n        eve.once(\"mina.stop.\" + anim.id, function () {\n            delete el.anims[anim.id];\n        });\n        return el;\n    };\n    var eldata = {};\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key. (Don’t confuse\n     * with `data-` attributes)\n     *\n     * See also @Element.removeData\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 0){\n            eve(\"snap.data.get.\" + this.id, this, data, null);\n            return data;\n        }\n        if (arguments.length == 1) {\n            if (Snap.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"snap.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"snap.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            eldata[this.id] = {};\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n    /*\\\n     * Element.outerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n     *\n     * See also @Element.innerSVG\n     = (string) SVG code for the element\n    \\*/\n    /*\\\n     * Element.toString\n     [ method ]\n     **\n     * See @Element.outerSVG\n    \\*/\n    elproto.outerSVG = elproto.toString = toString(1);\n    /*\\\n     * Element.innerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.innerSVG = toString();\n    function toString(type) {\n        return function () {\n            var res = type ? \"<\" + this.type : \"\",\n                attr = this.node.attributes,\n                chld = this.node.childNodes;\n            if (type) {\n                for (var i = 0, ii = attr.length; i < ii; i++) {\n                    res += \" \" + attr[i].name + '=\"' +\n                            attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n                }\n            }\n            if (chld.length) {\n                type && (res += \">\");\n                for (i = 0, ii = chld.length; i < ii; i++) {\n                    if (chld[i].nodeType == 3) {\n                        res += chld[i].nodeValue;\n                    } else if (chld[i].nodeType == 1) {\n                        res += wrap(chld[i]).toString();\n                    }\n                }\n                type && (res += \"</\" + this.type + \">\");\n            } else {\n                type && (res += \"/>\");\n            }\n            return res;\n        };\n    }\n}(Element.prototype));\n// SIERRA Snap.parse() accepts & returns a fragment, but there's no info on what it does in between. What if it doesn't parse?\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n    var f = glob.doc.createDocumentFragment(),\n        full = true,\n        div = glob.doc.createElement(\"div\");\n    svg = Str(svg);\n    if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n        svg = \"<svg>\" + svg + \"</svg>\";\n        full = false;\n    }\n    div.innerHTML = svg;\n    svg = div.getElementsByTagName(\"svg\")[0];\n    if (svg) {\n        if (full) {\n            f = svg;\n        } else {\n            while (svg.firstChild) {\n                f.appendChild(svg.firstChild);\n            }\n        }\n    }\n    div.innerHTML = E;\n    return new Fragment(f);\n};\nfunction Fragment(frag) {\n    this.node = frag;\n}\n/*\\\n * Fragment.select\n [ method ]\n **\n * See @Element.select\n\\*/\nFragment.prototype.select = Element.prototype.select;\n/*\\\n * Fragment.selectAll\n [ method ]\n **\n * See @Element.selectAll\n\\*/\nFragment.prototype.selectAll = Element.prototype.selectAll;\n// SIERRA Snap.fragment() could especially use a code example\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n    var args = Array.prototype.slice.call(arguments, 0),\n        f = glob.doc.createDocumentFragment();\n    for (var i = 0, ii = args.length; i < ii; i++) {\n        var item = args[i];\n        if (item.node && item.node.nodeType) {\n            f.appendChild(item.node);\n        }\n        if (item.nodeType) {\n            f.appendChild(item);\n        }\n        if (typeof item == \"string\") {\n            f.appendChild(Snap.parse(item).node);\n        }\n    }\n    return new Fragment(f);\n};\n\nfunction make(name, parent) {\n    var res = $(name);\n    parent.appendChild(res);\n    var el = wrap(res);\n    el.type = name;\n    return el;\n}\nfunction Paper(w, h) {\n    var res,\n        desc,\n        defs,\n        proto = Paper.prototype;\n    if (w && w.tagName == \"svg\") {\n        if (w.snap in hub) {\n            return hub[w.snap];\n        }\n        res = new Element(w);\n        desc = w.getElementsByTagName(\"desc\")[0];\n        defs = w.getElementsByTagName(\"defs\")[0];\n        if (!desc) {\n            desc = $(\"desc\");\n            desc.appendChild(glob.doc.createTextNode(\"Created with Snap\"));\n            res.node.appendChild(desc);\n        }\n        if (!defs) {\n            defs = $(\"defs\");\n            res.node.appendChild(defs);\n        }\n        res.defs = defs;\n        for (var key in proto) if (proto[has](key)) {\n            res[key] = proto[key];\n        }\n        res.paper = res.root = res;\n    } else {\n        res = make(\"svg\", glob.doc.body);\n        $(res.node, {\n            height: h,\n            version: 1.1,\n            width: w,\n            xmlns: xmlns\n        });\n    }\n    return res;\n}\nfunction wrap(dom) {\n    if (!dom) {\n        return dom;\n    }\n    if (dom instanceof Element || dom instanceof Fragment) {\n        return dom;\n    }\n    if (dom.tagName == \"svg\") {\n        return new Paper(dom);\n    }\n    return new Element(dom);\n}\n// gradients' helpers\nfunction Gstops() {\n    return this.selectAll(\"stop\");\n}\nfunction GaddStop(color, offset) {\n    var stop = $(\"stop\"),\n        attr = {\n            offset: +offset + \"%\"\n        };\n    color = Snap.color(color);\n    attr[\"stop-color\"] = color.hex;\n    if (color.opacity < 1) {\n        attr[\"stop-opacity\"] = color.opacity;\n    }\n    $(stop, attr);\n    this.node.appendChild(stop);\n    return this;\n}\nfunction GgetBBox() {\n    if (this.type == \"linearGradient\") {\n        var x1 = $(this.node, \"x1\") || 0,\n            x2 = $(this.node, \"x2\") || 1,\n            y1 = $(this.node, \"y1\") || 0,\n            y2 = $(this.node, \"y2\") || 0;\n        return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n    } else {\n        var cx = this.node.cx || .5,\n            cy = this.node.cy || .5,\n            r = this.node.r || 0;\n        return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n    }\n}\nfunction gradient(defs, str) {\n    var grad = arrayFirstValue(eve(\"snap.util.grad.parse\", null, str)),\n        el;\n    if (!grad) {\n        return null;\n    }\n    grad.params.unshift(defs);\n    if (grad.type.toLowerCase() == \"l\") {\n        el = gradientLinear.apply(0, grad.params);\n    } else {\n        el = gradientRadial.apply(0, grad.params);\n    }\n    if (grad.type != grad.type.toLowerCase()) {\n        $(el.node, {\n            gradientUnits: \"userSpaceOnUse\"\n        });\n    }\n    var stops = grad.stops,\n        len = stops.length,\n        start = 0,\n        j = 0;\n    function seed(i, end) {\n        var step = (end - start) / (i - j);\n        for (var k = j; k < i; k++) {\n            stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n        }\n        j = i;\n        start = end;\n    }\n    len--;\n    for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n        seed(i, stops[i].offset);\n    }\n    stops[len].offset = stops[len].offset || 100;\n    seed(len, stops[len].offset);\n    for (i = 0; i <= len; i++) {\n        var stop = stops[i];\n        el.addStop(stop.color, stop.offset);\n    }\n    return el;\n}\nfunction gradientLinear(defs, x1, y1, x2, y2) {\n    var el = make(\"linearGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (x1 != null) {\n        $(el.node, {\n            x1: x1,\n            y1: y1,\n            x2: x2,\n            y2: y2\n        });\n    }\n    return el;\n}\nfunction gradientRadial(defs, cx, cy, r, fx, fy) {\n    var el = make(\"radialGradient\", defs);\n    el.stops = Gstops;\n    el.addStop = GaddStop;\n    el.getBBox = GgetBBox;\n    if (cx != null) {\n        $(el.node, {\n            cx: cx,\n            cy: cy,\n            r: r\n        });\n    }\n    if (fx != null && fy != null) {\n        $(el.node, {\n            fx: fx,\n            fy: fy\n        });\n    }\n    return el;\n}\n// Paper prototype methods\n(function (proto) {\n    /*\\\n     * Paper.el\n     [ method ]\n     **\n     * Creates an element on paper with a given name and no attributes\n     **\n     - name (string) tag name\n     - attr (object) attributes\n     = (Element) the current element\n     > Usage\n     | var c = paper.circle(10, 10, 10); // is the same as...\n     | var c = paper.el(\"circle\").attr({\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n     | // and the same as\n     | var c = paper.el(\"circle\", {\n     |     cx: 10,\n     |     cy: 10,\n     |     r: 10\n     | });\n    \\*/\n    proto.el = function (name, attr) {\n        return make(name, this.node).attr(attr);\n    };\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - rx (number) #optional horizontal radius for rounded corners, default is 0\n     - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n     = (object) the `rect` element\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    proto.rect = function (x, y, w, h, rx, ry) {\n        var attr;\n        if (ry == null) {\n            ry = rx;\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                width: w,\n                height: h\n            };\n            if (rx != null) {\n                attr.rx = rx;\n                attr.ry = ry;\n            }\n        }\n        return this.el(\"rect\", attr);\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) the `circle` element\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    proto.circle = function (cx, cy, r) {\n        var attr;\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            attr = cx;\n        } else if (cx != null) {\n            attr = {\n                cx: cx,\n                cy: cy,\n                r: r\n            };\n        }\n        return this.el(\"circle\", attr);\n    };\n\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Places an image on the surface\n     **\n     - src (string) URI of the source image\n     - x (number) x offset position\n     - y (number) y offset position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) the `image` element\n     * or\n     = (object) Snap element object with type `image`\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    proto.image = function (src, x, y, width, height) {\n        var el = make(\"image\", this.node);\n        if (is(src, \"object\") && \"src\" in src) {\n            el.attr(src);\n        } else if (src != null) {\n            var set = {\n                \"xlink:href\": src,\n                preserveAspectRatio: \"none\"\n            };\n            if (x != null && y != null) {\n                set.x = x;\n                set.y = y;\n            }\n            if (width != null && height != null) {\n                set.width = width;\n                set.height = height;\n            } else {\n                preload(src, function () {\n                    $(el.node, {\n                        width: this.offsetWidth,\n                        height: this.offsetHeight\n                    });\n                });\n            }\n            $(el.node, set);\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) the `ellipse` element\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    proto.ellipse = function (cx, cy, rx, ry) {\n        var el = make(\"ellipse\", this.node);\n        if (is(cx, \"object\") && \"cx\" in cx) {\n            el.attr(cx);\n        } else if (cx != null) {\n            el.attr({\n                cx: cx,\n                cy: cy,\n                rx: rx,\n                ry: ry\n            });\n        }\n        return el;\n    };\n    // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a `<path>` element using the given string as the path's definition\n     - pathString (string) #optional path string in SVG format\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n     | \"M10,20L30,40\"\n     * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n     * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n    \\*/\n    proto.path = function (d) {\n        var el = make(\"path\", this.node);\n        if (is(d, \"object\") && !is(d, \"array\")) {\n            el.attr(d);\n        } else if (d) {\n            el.attr({\n                d: d\n            });\n        }\n        return el;\n    };\n// SIERRA Paper.g(): Don't understand the code comment about the order being _different._ Wouldn't it be a rect followed by a circle?\n    /*\\\n     * Paper.g\n     [ method ]\n     **\n     * Creates a group element\n     **\n     - varargs (…) #optional elements to nest within the group\n     = (object) the `g` element\n     **\n     > Usage\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g(c2, c1); // note that the order of elements is different\n     * or\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g();\n     | g.add(c2, c1);\n    \\*/\n    /*\\\n     * Paper.group\n     [ method ]\n     **\n     * See @Paper.g\n    \\*/\n    proto.group = proto.g = function (first) {\n        var el = make(\"g\", this.node);\n        el.add = add2group;\n        for (var method in proto) if (proto[has](method)) {\n            el[method] = proto[method];\n        }\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string|array) The text string to draw or array of strings to nest within separate `<tspan>` elements\n     = (object) the `text` element\n     **\n     > Usage\n     | var t1 = paper.text(50, 50, \"Snap\");\n     | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n     | // Text path usage\n     | t1.attr({textpath: \"M10,10L100,100\"});\n     | // or\n     | var pth = paper.path(\"M10,10L100,100\");\n     | t1.attr({textpath: pth});\n    \\*/\n    proto.text = function (x, y, text) {\n        var el = make(\"text\", this.node);\n        if (is(x, \"object\")) {\n            el.attr(x);\n        } else if (x != null) {\n            el.attr({\n                x: x,\n                y: y,\n                text: text || \"\"\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.line\n     [ method ]\n     **\n     * Draws a line\n     **\n     - x1 (number) x coordinate position of the start\n     - y1 (number) y coordinate position of the start\n     - x2 (number) x coordinate position of the end\n     - y2 (number) y coordinate position of the end\n     = (object) the `line` element\n     **\n     > Usage\n     | var t1 = paper.line(50, 50, 100, 100);\n    \\*/\n    proto.line = function (x1, y1, x2, y2) {\n        var el = make(\"line\", this.node);\n        if (is(x1, \"object\")) {\n            el.attr(x1);\n        } else if (x1 != null) {\n            el.attr({\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polyline\n     [ method ]\n     **\n     * Draws a polyline\n     **\n     - points (array) array of points\n     * or\n     - varargs (…) points\n     = (object) the `polyline` element\n     **\n     > Usage\n     | var p1 = paper.polyline([10, 10, 100, 100]);\n     | var p2 = paper.polyline(10, 10, 100, 100);\n    \\*/\n    proto.polyline = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polyline\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    /*\\\n     * Paper.polygon\n     [ method ]\n     **\n     * Draws a polygon. See @Paper.polyline\n    \\*/\n    proto.polygon = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var el = make(\"polygon\", this.node);\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            el.attr(points);\n        } else if (points != null) {\n            el.attr({\n                points: points\n            });\n        }\n        return el;\n    };\n    // gradients\n    (function () {\n        /*\\\n         * Paper.gradient\n         [ method ]\n         **\n         * Creates a gradient element\n         **\n         - gradient (string) gradient descriptor\n         > Gradient Descriptor\n         * The gradient descriptor is an expression formatted as\n         * follows: `<type>(<coords>)<colors>`.  The `<type>` can be\n         * either linear or radial.  The uppercase `L` or `R` letters\n         * indicate absolute coordinates offset from the SVG surface.\n         * Lowercase `l` or `r` letters indicate coordinates\n         * calculated relative to the element to which the gradient is\n         * applied.  Coordinates specify a linear gradient vector as\n         * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n         * `r` and optional `fx`, `fy` specifying a focal point away\n         * from the center of the circle. Specify `<colors>` as a list\n         * of dash-separated CSS color values.  Each color may be\n         * followed by a custom offset value, separated with a colon\n         * character.\n         > Examples\n         * Linear gradient, relative from top-left corner to bottom-right\n         * corner, from black through red to white:\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         * Linear gradient, absolute from (0, 0) to (100, 100), from black\n         * through red at 25% to white:\n         | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25%-#fff\");\n         * Radial gradient, relative from the center of the element with radius\n         * half the width, from black to white:\n         | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n         * To apply the gradient:\n         | paper.circle(50, 50, 40).attr({\n         |     fill: g\n         | });\n         = (object) the `gradient` element\n        \\*/\n        proto.gradient = function (str) {\n            return gradient(this.defs, str);\n        };\n        proto.gradientLinear = function (x1, y1, x2, y2) {\n            return gradientLinear(this.defs, x1, y1, x2, y2);\n        };\n        proto.gradientRadial = function (cx, cy, r, fx, fy) {\n            return gradientRadial(this.defs, cx, cy, r, fx, fy);\n        };\n        /*\\\n         * Paper.toString\n         [ method ]\n         **\n         * Returns SVG code for the @Paper\n         = (string) SVG code for the @Paper\n        \\*/\n        proto.toString = function () {\n            var f = glob.doc.createDocumentFragment(),\n                d = glob.doc.createElement(\"div\"),\n                svg = this.node.cloneNode(true),\n                res;\n            f.appendChild(d);\n            d.appendChild(svg);\n            $(svg, {xmlns: xmlns});\n            res = d.innerHTML;\n            f.removeChild(f.firstChild);\n            return res;\n        };\n        /*\\\n         * Paper.clear\n         [ method ]\n         **\n         * Removes all child nodes of the paper, except <defs>.\n        \\*/\n        proto.clear = function () {\n            var node = this.node.firstChild,\n                next;\n            while (node) {\n                next = node.nextSibling;\n                if (node.tagName != \"defs\") {\n                    node.parentNode.removeChild(node);\n                }\n                node = next;\n            }\n        };\n    }());\n}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n    var req = new XMLHttpRequest,\n        id = ID();\n    if (req) {\n        if (is(postData, \"function\")) {\n            scope = callback;\n            callback = postData;\n            postData = null;\n        } else if (is(postData, \"object\")) {\n            var pd = [];\n            for (var key in postData) if (postData.hasOwnProperty(key)) {\n                pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n            }\n            postData = pd.join(\"&\");\n        }\n        req.open((postData ? \"POST\" : \"GET\"), url, true);\n        req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n        if (postData) {\n            req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n        }\n        if (callback) {\n            eve.once(\"snap.ajax.\" + id + \".0\", callback);\n            eve.once(\"snap.ajax.\" + id + \".200\", callback);\n            eve.once(\"snap.ajax.\" + id + \".304\", callback);\n        }\n        req.onreadystatechange = function() {\n            if (req.readyState != 4) return;\n            eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n        };\n        if (req.readyState == 4) {\n            return req;\n        }\n        req.send(postData);\n        return req;\n    }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n    Snap.ajax(url, function (req) {\n        var f = Snap.parse(req.responseText);\n        scope ? callback.call(scope, f) : callback(f);\n    });\n};\n\n// Attributes event handlers\neve.on(\"snap.util.attr.mask\", function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value.type == \"mask\") {\n            var mask = value;\n        } else {\n            mask = make(\"mask\", getSomeDefs(this));\n            mask.node.appendChild(value.node);\n            !mask.node.id && $(mask.node, {\n                id: mask.id\n            });\n        }\n        $(this.node, {\n            mask: URL(mask.id)\n        });\n    }\n});\n(function (clipIt) {\n    eve.on(\"snap.util.attr.clip\", clipIt);\n    eve.on(\"snap.util.attr.clip-path\", clipIt);\n    eve.on(\"snap.util.attr.clipPath\", clipIt);\n}(function (value) {\n    if (value instanceof Element || value instanceof Fragment) {\n        eve.stop();\n        if (value.type == \"clipPath\") {\n            var clip = value;\n        } else {\n            clip = make(\"clipPath\", getSomeDefs(this));\n            clip.node.appendChild(value.node);\n            !clip.node.id && $(clip.node, {\n                id: clip.id\n            });\n        }\n        $(this.node, {\n            \"clip-path\": URL(clip.id)\n        });\n    }\n}));\nfunction fillStroke(name) {\n    return function (value) {\n        eve.stop();\n        if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n            (value.node.firstChild.tagName == \"radialGradient\" ||\n            value.node.firstChild.tagName == \"linearGradient\" ||\n            value.node.firstChild.tagName == \"pattern\")) {\n            value = value.node.firstChild;\n            getSomeDefs(this).appendChild(value);\n            value = wrap(value);\n        }\n        if (value instanceof Element) {\n            if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n               || value.type == \"pattern\") {\n                if (!value.node.id) {\n                    $(value.node, {\n                        id: value.id\n                    });\n                }\n                var fill = URL(value.node.id);\n            } else {\n                fill = value.attr(name);\n            }\n        } else {\n            fill = Snap.color(value);\n            if (fill.error) {\n                var grad = gradient(getSomeDefs(this), value);\n                if (grad) {\n                    if (!grad.node.id) {\n                        $(grad.node, {\n                            id: grad.id\n                        });\n                    }\n                    fill = URL(grad.node.id);\n                } else {\n                    fill = value;\n                }\n            } else {\n                fill = Str(fill);\n            }\n        }\n        var attrs = {};\n        attrs[name] = fill;\n        $(this.node, attrs);\n        this.node.style[name] = E;\n    };\n}\neve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\neve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\nvar gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\neve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n    string = Str(string);\n    var tokens = string.match(gradrg);\n    if (!tokens) {\n        return null;\n    }\n    var type = tokens[1],\n        params = tokens[2],\n        stops = tokens[3];\n    params = params.split(/\\s*,\\s*/).map(function (el) {\n        return +el == el ? +el : el;\n    });\n    if (params.length == 1 && params[0] == 0) {\n        params = [];\n    }\n    stops = stops.split(\"-\");\n    stops = stops.map(function (el) {\n        el = el.split(\":\");\n        var out = {\n            color: el[0]\n        };\n        if (el[1]) {\n            out.offset = el[1];\n        }\n        return out;\n    });\n    return {\n        type: type,\n        params: params,\n        stops: stops\n    };\n});\n\neve.on(\"snap.util.attr.d\", function (value) {\n    eve.stop();\n    if (is(value, \"array\") && is(value[0], \"array\")) {\n        value = Snap.path.toString.call(value);\n    }\n    value = Str(value);\n    if (value.match(/[ruo]/i)) {\n        value = Snap.path.toAbsolute(value);\n    }\n    $(this.node, {d: value});\n})(-1);\neve.on(\"snap.util.attr.#text\", function (value) {\n    eve.stop();\n    value = Str(value);\n    var txt = glob.doc.createTextNode(value);\n    while (this.node.firstChild) {\n        this.node.removeChild(this.node.firstChild);\n    }\n    this.node.appendChild(txt);\n})(-1);\neve.on(\"snap.util.attr.path\", function (value) {\n    eve.stop();\n    this.attr({d: value});\n})(-1);\neve.on(\"snap.util.attr.viewBox\", function (value) {\n    var vb;\n    if (is(value, \"object\") && \"x\" in value) {\n        vb = [value.x, value.y, value.width, value.height].join(\" \");\n    } else if (is(value, \"array\")) {\n        vb = value.join(\" \");\n    } else {\n        vb = value;\n    }\n    $(this.node, {\n        viewBox: vb\n    });\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.transform\", function (value) {\n    this.transform(value);\n    eve.stop();\n})(-1);\neve.on(\"snap.util.attr.r\", function (value) {\n    if (this.type == \"rect\") {\n        eve.stop();\n        $(this.node, {\n            rx: value,\n            ry: value\n        });\n    }\n})(-1);\neve.on(\"snap.util.attr.textpath\", function (value) {\n    eve.stop();\n    if (this.type == \"text\") {\n        var id, tp, node;\n        if (!value && this.textPath) {\n            tp = this.textPath;\n            while (tp.node.firstChild) {\n                this.node.appendChild(tp.node.firstChild);\n            }\n            tp.remove();\n            delete this.textPath;\n            return;\n        }\n        if (is(value, \"string\")) {\n            var defs = getSomeDefs(this),\n                path = wrap(defs.parentNode).path(value);\n            defs.appendChild(path.node);\n            id = path.id;\n            path.attr({id: id});\n        } else {\n            value = wrap(value);\n            if (value instanceof Element) {\n                id = value.attr(\"id\");\n                if (!id) {\n                    id = value.id;\n                    value.attr({id: id});\n                }\n            }\n        }\n        if (id) {\n            tp = this.textPath;\n            node = this.node;\n            if (tp) {\n                tp.attr({\"xlink:href\": \"#\" + id});\n            } else {\n                tp = $(\"textPath\", {\n                    \"xlink:href\": \"#\" + id\n                });\n                while (node.firstChild) {\n                    tp.appendChild(node.firstChild);\n                }\n                node.appendChild(tp);\n                this.textPath = wrap(tp);\n            }\n        }\n    }\n})(-1);\neve.on(\"snap.util.attr.text\", function (value) {\n    if (this.type == \"text\") {\n        var i = 0,\n            node = this.node,\n            tuner = function (chunk) {\n                var out = $(\"tspan\");\n                if (is(chunk, \"array\")) {\n                    for (var i = 0; i < chunk.length; i++) {\n                        out.appendChild(tuner(chunk[i]));\n                    }\n                } else {\n                    out.appendChild(glob.doc.createTextNode(chunk));\n                }\n                out.normalize && out.normalize();\n                return out;\n            };\n        while (node.firstChild) {\n            node.removeChild(node.firstChild);\n        }\n        var tuned = tuner(value);\n        while (tuned.firstChild) {\n            node.appendChild(tuned.firstChild);\n        }\n    }\n    eve.stop();\n})(-1);\n// default\nvar cssAttr = {\n    \"alignment-baseline\": 0,\n    \"baseline-shift\": 0,\n    \"clip\": 0,\n    \"clip-path\": 0,\n    \"clip-rule\": 0,\n    \"color\": 0,\n    \"color-interpolation\": 0,\n    \"color-interpolation-filters\": 0,\n    \"color-profile\": 0,\n    \"color-rendering\": 0,\n    \"cursor\": 0,\n    \"direction\": 0,\n    \"display\": 0,\n    \"dominant-baseline\": 0,\n    \"enable-background\": 0,\n    \"fill\": 0,\n    \"fill-opacity\": 0,\n    \"fill-rule\": 0,\n    \"filter\": 0,\n    \"flood-color\": 0,\n    \"flood-opacity\": 0,\n    \"font\": 0,\n    \"font-family\": 0,\n    \"font-size\": 0,\n    \"font-size-adjust\": 0,\n    \"font-stretch\": 0,\n    \"font-style\": 0,\n    \"font-variant\": 0,\n    \"font-weight\": 0,\n    \"glyph-orientation-horizontal\": 0,\n    \"glyph-orientation-vertical\": 0,\n    \"image-rendering\": 0,\n    \"kerning\": 0,\n    \"letter-spacing\": 0,\n    \"lighting-color\": 0,\n    \"marker\": 0,\n    \"marker-end\": 0,\n    \"marker-mid\": 0,\n    \"marker-start\": 0,\n    \"mask\": 0,\n    \"opacity\": 0,\n    \"overflow\": 0,\n    \"pointer-events\": 0,\n    \"shape-rendering\": 0,\n    \"stop-color\": 0,\n    \"stop-opacity\": 0,\n    \"stroke\": 0,\n    \"stroke-dasharray\": 0,\n    \"stroke-dashoffset\": 0,\n    \"stroke-linecap\": 0,\n    \"stroke-linejoin\": 0,\n    \"stroke-miterlimit\": 0,\n    \"stroke-opacity\": 0,\n    \"stroke-width\": 0,\n    \"text-anchor\": 0,\n    \"text-decoration\": 0,\n    \"text-rendering\": 0,\n    \"unicode-bidi\": 0,\n    \"visibility\": 0,\n    \"word-spacing\": 0,\n    \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n    var att = eve.nt(),\n        attr = {};\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    attr[att] = value;\n    var style = att.replace(/-(\\w)/gi, function (all, letter) {\n            return letter.toUpperCase();\n        }),\n        css = att.replace(/[A-Z]/g, function (letter) {\n            return \"-\" + letter.toLowerCase();\n        });\n    if (cssAttr[has](css)) {\n        this.node.style[style] = value == null ? E : value;\n    } else {\n        $(this.node, attr);\n    }\n});\neve.on(\"snap.util.getattr.transform\", function () {\n    eve.stop();\n    return this.transform();\n})(-1);\neve.on(\"snap.util.getattr.textpath\", function () {\n    eve.stop();\n    return this.textPath;\n})(-1);\n// Markers\n(function () {\n    function getter(end) {\n        return function () {\n            eve.stop();\n            var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n            if (style == \"none\") {\n                return style;\n            } else {\n                return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n            }\n        };\n    }\n    function setter(end) {\n        return function (value) {\n            eve.stop();\n            var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n            if (value == \"\" || !value) {\n                this.node.style[name] = \"none\";\n                return;\n            }\n            if (value.type == \"marker\") {\n                var id = value.node.id;\n                if (!id) {\n                    $(value.node, {id: value.id});\n                }\n                this.node.style[name] = URL(id);\n                return;\n            }\n        };\n    }\n    eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n    eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n    eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n    eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n    eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n    eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n}());\neve.on(\"snap.util.getattr.r\", function () {\n    if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n        eve.stop();\n        return $(this.node, \"rx\");\n    }\n})(-1);\nfunction textExtract(node) {\n    var out = [];\n    var children = node.childNodes;\n    for (var i = 0, ii = children.length; i < ii; i++) {\n        var chi = children[i];\n        if (chi.nodeType == 3) {\n            out.push(chi.nodeValue);\n        }\n        if (chi.tagName == \"tspan\") {\n            if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n                out.push(chi.firstChild.nodeValue);\n            } else {\n                out.push(textExtract(chi));\n            }\n        }\n    }\n    return out;\n}\neve.on(\"snap.util.getattr.text\", function () {\n    if (this.type == \"text\" || this.type == \"tspan\") {\n        eve.stop();\n        var out = textExtract(this.node);\n        return out.length == 1 ? out[0] : out;\n    }\n})(-1);\neve.on(\"snap.util.getattr.#text\", function () {\n    return this.node.textContent;\n})(-1);\neve.on(\"snap.util.getattr.viewBox\", function () {\n    eve.stop();\n    var vb = $(this.node, \"viewBox\").split(separator);\n    return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n    // TODO: investigate why I need to z-index it\n})(-1);\neve.on(\"snap.util.getattr.points\", function () {\n    var p = $(this.node, \"points\");\n    eve.stop();\n    return p.split(separator);\n});\neve.on(\"snap.util.getattr.path\", function () {\n    var p = $(this.node, \"d\");\n    eve.stop();\n    return p;\n});\n// default\neve.on(\"snap.util.getattr\", function () {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    var css = att.replace(/[A-Z]/g, function (letter) {\n        return \"-\" + letter.toLowerCase();\n    });\n    if (cssAttr[has](css)) {\n        return glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n    } else {\n        return $(this.node, att);\n    }\n});\nvar getOffset = function (elem) {\n    var box = elem.getBoundingClientRect(),\n        doc = elem.ownerDocument,\n        body = doc.body,\n        docElem = doc.documentElement,\n        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n        top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n        left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n    return {\n        y: top,\n        x: left\n    };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n    var paper = this,\n        svg = paper.canvas,\n        target = glob.doc.elementFromPoint(x, y);\n    if (glob.win.opera && target.tagName == \"svg\") {\n        var so = getOffset(target),\n            sr = target.createSVGRect();\n        sr.x = x - so.x;\n        sr.y = y - so.y;\n        sr.width = sr.height = 1;\n        var hits = target.getIntersectionList(sr, null);\n        if (hits.length) {\n            target = hits[hits.length - 1];\n        }\n    }\n    if (!target) {\n        return null;\n    }\n    return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with four arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global) {\n |     Snap.newmethod = function () {};\n |     Element.prototype.newmethod = function () {};\n |     Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n    f(Snap, Element, Paper, glob);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}());\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        clone = Snap._.clone,\n        has = \"hasOwnProperty\",\n        p2s = /,?([a-z]),?/gi,\n        toFloat = parseFloat,\n        math = Math,\n        PI = math.PI,\n        mmin = math.min,\n        mmax = math.max,\n        pow = math.pow,\n        abs = math.abs;\n    function paths(ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    }\n    function box(x, y, width, height) {\n        if (x == null) {\n            x = y = width = height = 0;\n        }\n        if (y == null) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        return {\n            x: x,\n            y: y,\n            width: width,\n            w: width,\n            height: height,\n            h: height,\n            x2: x + width,\n            y2: y + height,\n            cx: x + width / 2,\n            cy: y + height / 2,\n            r1: math.min(width, height) / 2,\n            r2: math.max(width, height) / 2,\n            r0: math.sqrt(width * width + height * height) / 2,\n            path: rectPath(x, y, width, height),\n            vb: [x, y, width, height].join(\" \")\n        };\n    }\n    function toString() {\n        return this.join(\",\").replace(p2s, \"$1\");\n    }\n    function pathClone(pathArray) {\n        var res = clone(pathArray);\n        res.toString = toString;\n        return res;\n    }\n    function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n                getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    }\n    function getLengthFactory(istotal, subpath) {\n        function O(val) {\n            return +(+val).toFixed(3);\n        }\n        return Snap._.cacher(function (path, length, onlystart) {\n            if (path instanceof Element) {\n                path = path.attr(\"d\");\n            }\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\n                                \"C\" + O(point.start.x),\n                                O(point.start.y),\n                                O(point.m.x),\n                                O(point.m.y),\n                                O(point.x),\n                                O(point.y)\n                            ];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\n                                \"M\" + O(point.x),\n                                O(point.y) + \"C\" + O(point.n.x),\n                                O(point.n.y),\n                                O(point.end.x),\n                                O(point.end.y),\n                                O(p[5]),\n                                O(p[6])\n                            ].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return point;\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            return point;\n        }, null, Snap._.clone);\n    }\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);\n        // (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    }\n    function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!Snap.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return box(\n            bbox.min.x,\n            bbox.min.y,\n            bbox.max.x - bbox.min.x,\n            bbox.max.y - bbox.min.y\n        );\n    }\n    function isPointInsideBBox(bbox, x, y) {\n        return  x >= bbox.x &&\n                x <= bbox.x + bbox.width &&\n                y >= bbox.y &&\n                y <= bbox.y + bbox.height;\n    }\n    function isBBoxIntersect(bbox1, bbox2) {\n        bbox1 = box(bbox1);\n        bbox2 = box(bbox2);\n        return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n                || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n                || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    }\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = bezierBBox(bez1),\n            bbox2 = bezierBBox(bez2);\n        if (!isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = ~~(l1 / 5),\n            n2 = ~~(l2 / 5),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: t1,\n                                t2: t2\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function pathIntersection(path1, path2) {\n        return interPathHelper(path1, path2);\n    }\n    function pathIntersectionNumber(path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    }\n    function interPathHelper(path1, path2, justCount) {\n        path1 = path2curve(path1);\n        path2 = path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function isPointInsidePath(path, x, y) {\n        var bbox = pathBBox(path);\n        return isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    }\n    function pathBBox(path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return box();\n        }\n        path = path2curve(path);\n        var x = 0, \n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X.concat(dim.min.x, dim.max.x);\n                Y = Y.concat(dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin.apply(0, X),\n            ymin = mmin.apply(0, Y),\n            xmax = mmax.apply(0, X),\n            ymax = mmax.apply(0, Y),\n            bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n        pth.bbox = clone(bb);\n        return bb;\n    }\n    function rectPath(x, y, w, h, r) {\n        if (r) {\n            return [\n                [\"M\", x + r, y],\n                [\"l\", w - r * 2, 0],\n                [\"a\", r, r, 0, 0, 1, r, r],\n                [\"l\", 0, h - r * 2],\n                [\"a\", r, r, 0, 0, 1, -r, r],\n                [\"l\", r * 2 - w, 0],\n                [\"a\", r, r, 0, 0, 1, -r, -r],\n                [\"l\", 0, r * 2 - h],\n                [\"a\", r, r, 0, 0, 1, r, -r],\n                [\"z\"]\n            ];\n        }\n        var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        res.toString = toString;\n        return res;\n    }\n    function ellipsePath(x, y, rx, ry, a) {\n        if (a == null && ry == null) {\n            ry = rx;\n        }\n        if (a != null) {\n            var rad = Math.PI / 180,\n                x1 = x + rx * Math.cos(-ry * rad),\n                x2 = x + rx * Math.cos(-a * rad),\n                y1 = y + rx * Math.sin(-ry * rad),\n                y2 = y + rx * Math.sin(-a * rad),\n                res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n        } else {\n            res = [\n                [\"M\", x, y],\n                [\"m\", 0, -ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n                [\"z\"]\n            ];\n        }\n        res.toString = toString;\n        return res;\n    }\n    var unit2px = Snap._unit2px,\n        getPath = {\n        path: function (el) {\n            return el.attr(\"path\");\n        },\n        circle: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.r);\n        },\n        ellipse: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.rx, attr.ry);\n        },\n        rect: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height, attr.rx, attr.ry);\n        },\n        image: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x, attr.y, attr.width, attr.height);\n        },\n        text: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        g: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        symbol: function (el) {\n            var bbox = el.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        line: function (el) {\n            return \"M\" + [el.attr(\"x1\"), el.attr(\"y1\"), el.attr(\"x2\"), el.attr(\"y2\")];\n        },\n        polyline: function (el) {\n            return \"M\" + el.attr(\"points\");\n        },\n        polygon: function (el) {\n            return \"M\" + el.attr(\"points\") + \"z\";\n        },\n        svg: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        },\n        deflt: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        }\n    };\n    function pathToRelative(pathArray) {\n        var pth = paths(pathArray),\n            lowerCase = String.prototype.toLowerCase;\n        if (pth.rel) {\n            return pathClone(pth.rel);\n        }\n        if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0;\n        if (pathArray[0][0] == \"M\") {\n            x = pathArray[0][1];\n            y = pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res.push([\"M\", x, y]);\n        }\n        for (var i = start, ii = pathArray.length; i < ii; i++) {\n            var r = res[i] = [],\n                pa = pathArray[i];\n            if (pa[0] != lowerCase.call(pa[0])) {\n                r[0] = lowerCase.call(pa[0]);\n                switch (r[0]) {\n                    case \"a\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] - x).toFixed(3);\n                        r[7] = +(pa[7] - y).toFixed(3);\n                        break;\n                    case \"v\":\n                        r[1] = +(pa[1] - y).toFixed(3);\n                        break;\n                    case \"m\":\n                        mx = pa[1];\n                        my = pa[2];\n                    default:\n                        for (var j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);\n                        }\n                }\n            } else {\n                r = res[i] = [];\n                if (pa[0] == \"m\") {\n                    mx = pa[1] + x;\n                    my = pa[2] + y;\n                }\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    res[i][k] = pa[k];\n                }\n            }\n            var len = res[i].length;\n            switch (res[i][0]) {\n                case \"z\":\n                    x = mx;\n                    y = my;\n                    break;\n                case \"h\":\n                    x += +res[i][len - 1];\n                    break;\n                case \"v\":\n                    y += +res[i][len - 1];\n                    break;\n                default:\n                    x += +res[i][len - 2];\n                    y += +res[i][len - 1];\n            }\n        }\n        res.toString = toString;\n        pth.rel = pathClone(res);\n        return res;\n    }\n    function pathToAbsolute(pathArray) {\n        var pth = paths(pathArray);\n        if (pth.abs) {\n            return pathClone(pth.abs);\n        }\n        if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        if (!pathArray || !pathArray.length) {\n            return [[\"M\", 0, 0]];\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0,\n            pa0;\n        if (pathArray[0][0] == \"M\") {\n            x = +pathArray[0][1];\n            y = +pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res[0] = [\"M\", x, y];\n        }\n        var crz = pathArray.length == 3 &&\n            pathArray[0][0] == \"M\" &&\n            pathArray[1][0].toUpperCase() == \"R\" &&\n            pathArray[2][0].toUpperCase() == \"Z\";\n        for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n            res.push(r = []);\n            pa = pathArray[i];\n            pa0 = pa[0];\n            if (pa0 != pa0.toUpperCase()) {\n                r[0] = pa0.toUpperCase();\n                switch (r[0]) {\n                    case \"A\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] + x);\n                        r[7] = +(pa[7] + y);\n                        break;\n                    case \"V\":\n                        r[1] = +pa[1] + y;\n                        break;\n                    case \"H\":\n                        r[1] = +pa[1] + x;\n                        break;\n                    case \"R\":\n                        var dots = [x, y].concat(pa.slice(1));\n                        for (var j = 2, jj = dots.length; j < jj; j++) {\n                            dots[j] = +dots[j] + x;\n                            dots[++j] = +dots[j] + y;\n                        }\n                        res.pop();\n                        res = res.concat(catmullRom2bezier(dots, crz));\n                        break;\n                    case \"O\":\n                        res.pop();\n                        dots = ellipsePath(x, y, pa[1], pa[2]);\n                        dots.push(dots[0]);\n                        res = res.concat(dots);\n                        break;\n                    case \"U\":\n                        res.pop();\n                        res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                        r = [\"U\"].concat(res[res.length - 1].slice(-2));\n                        break;\n                    case \"M\":\n                        mx = +pa[1] + x;\n                        my = +pa[2] + y;\n                    default:\n                        for (j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +pa[j] + ((j % 2) ? x : y);\n                        }\n                }\n            } else if (pa0 == \"R\") {\n                dots = [x, y].concat(pa.slice(1));\n                res.pop();\n                res = res.concat(catmullRom2bezier(dots, crz));\n                r = [\"R\"].concat(pa.slice(-2));\n            } else if (pa0 == \"O\") {\n                res.pop();\n                dots = ellipsePath(x, y, pa[1], pa[2]);\n                dots.push(dots[0]);\n                res = res.concat(dots);\n            } else if (pa0 == \"U\") {\n                res.pop();\n                res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                r = [\"U\"].concat(res[res.length - 1].slice(-2));\n            } else {\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    r[k] = pa[k];\n                }\n            }\n            pa0 = pa0.toUpperCase();\n            if (pa0 != \"O\") {\n                switch (r[0]) {\n                    case \"Z\":\n                        x = mx;\n                        y = my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n        }\n        res.toString = toString;\n        pth.abs = pathClone(res);\n        return res;\n    }\n    function l2c(x1, y1, x2, y2) {\n        return [x1, y1, x2, y2, x2, y2];\n    }\n    function q2c(x1, y1, ax, ay, x2, y2) {\n        var _13 = 1 / 3,\n            _23 = 2 / 3;\n        return [\n                _13 * x1 + _23 * ax,\n                _13 * y1 + _23 * ay,\n                _13 * x2 + _23 * ax,\n                _13 * y2 + _23 * ay,\n                x2,\n                y2\n            ];\n    }\n    function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n        // for more information of where this math came from visit:\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        var _120 = PI * 120 / 180,\n            rad = PI / 180 * (+angle || 0),\n            res = [],\n            xy,\n            rotate = Snap._.cacher(function (x, y, rad) {\n                var X = x * math.cos(rad) - y * math.sin(rad),\n                    Y = x * math.sin(rad) + y * math.cos(rad);\n                return {x: X, y: Y};\n            });\n        if (!recursive) {\n            xy = rotate(x1, y1, -rad);\n            x1 = xy.x;\n            y1 = xy.y;\n            xy = rotate(x2, y2, -rad);\n            x2 = xy.x;\n            y2 = xy.y;\n            var cos = math.cos(PI / 180 * angle),\n                sin = math.sin(PI / 180 * angle),\n                x = (x1 - x2) / 2,\n                y = (y1 - y2) / 2;\n            var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n            if (h > 1) {\n                h = math.sqrt(h);\n                rx = h * rx;\n                ry = h * ry;\n            }\n            var rx2 = rx * rx,\n                ry2 = ry * ry,\n                k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                    math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                cx = k * rx * y / ry + (x1 + x2) / 2,\n                cy = k * -ry * x / rx + (y1 + y2) / 2,\n                f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n            f1 = x1 < cx ? PI - f1 : f1;\n            f2 = x2 < cx ? PI - f2 : f2;\n            f1 < 0 && (f1 = PI * 2 + f1);\n            f2 < 0 && (f2 = PI * 2 + f2);\n            if (sweep_flag && f1 > f2) {\n                f1 = f1 - PI * 2;\n            }\n            if (!sweep_flag && f2 > f1) {\n                f2 = f2 - PI * 2;\n            }\n        } else {\n            f1 = recursive[0];\n            f2 = recursive[1];\n            cx = recursive[2];\n            cy = recursive[3];\n        }\n        var df = f2 - f1;\n        if (abs(df) > _120) {\n            var f2old = f2,\n                x2old = x2,\n                y2old = y2;\n            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n            x2 = cx + rx * math.cos(f2);\n            y2 = cy + ry * math.sin(f2);\n            res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n        }\n        df = f2 - f1;\n        var c1 = math.cos(f1),\n            s1 = math.sin(f1),\n            c2 = math.cos(f2),\n            s2 = math.sin(f2),\n            t = math.tan(df / 4),\n            hx = 4 / 3 * rx * t,\n            hy = 4 / 3 * ry * t,\n            m1 = [x1, y1],\n            m2 = [x1 + hx * s1, y1 - hy * c1],\n            m3 = [x2 + hx * s2, y2 - hy * c2],\n            m4 = [x2, y2];\n        m2[0] = 2 * m1[0] - m2[0];\n        m2[1] = 2 * m1[1] - m2[1];\n        if (recursive) {\n            return [m2, m3, m4].concat(res);\n        } else {\n            res = [m2, m3, m4].concat(res).join().split(\",\");\n            var newres = [];\n            for (var i = 0, ii = res.length; i < ii; i++) {\n                newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n            }\n            return newres;\n        }\n    }\n    function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t;\n        return {\n            x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n            y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n        };\n    }\n    function curveDim(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),\n            b = 2 * (c1x - p1x) - 2 * (c2x - c1x),\n            c = p1x - c1x,\n            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,\n            y = [p1y, p2y],\n            x = [p1x, p2x],\n            dot;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);\n        b = 2 * (c1y - p1y) - 2 * (c2y - c1y);\n        c = p1y - c1y;\n        t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;\n        abs(t1) > \"1e12\" && (t1 = .5);\n        abs(t2) > \"1e12\" && (t2 = .5);\n        if (t1 > 0 && t1 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        if (t2 > 0 && t2 < 1) {\n            dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);\n            x.push(dot.x);\n            y.push(dot.y);\n        }\n        return {\n            min: {x: mmin.apply(0, x), y: mmin.apply(0, y)},\n            max: {x: mmax.apply(0, x), y: mmax.apply(0, y)}\n        };\n    }\n    function path2curve(path, path2) {\n        var pth = !path2 && paths(path);\n        if (!path2 && pth.curve) {\n            return pathClone(pth.curve);\n        }\n        var p = pathToAbsolute(path),\n            p2 = path2 && pathToAbsolute(path2),\n            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            processPath = function (path, d) {\n                var nx, ny;\n                if (!path) {\n                    return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                }\n                !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);\n                switch (path[0]) {\n                    case \"M\":\n                        d.X = path[1];\n                        d.Y = path[2];\n                        break;\n                    case \"A\":\n                        path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n                        break;\n                    case \"S\":\n                        nx = d.x + (d.x - (d.bx || d.x));\n                        ny = d.y + (d.y - (d.by || d.y));\n                        path = [\"C\", nx, ny].concat(path.slice(1));\n                        break;\n                    case \"T\":\n                        d.qx = d.x + (d.x - (d.qx || d.x));\n                        d.qy = d.y + (d.y - (d.qy || d.y));\n                        path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                        break;\n                    case \"Q\":\n                        d.qx = path[1];\n                        d.qy = path[2];\n                        path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                        break;\n                    case \"L\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n                        break;\n                    case \"H\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n                        break;\n                    case \"V\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n                        break;\n                    case \"Z\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n                        break;\n                }\n                return path;\n            },\n            fixArc = function (pp, i) {\n                if (pp[i].length > 7) {\n                    pp[i].shift();\n                    var pi = pp[i];\n                    while (pi.length) {\n                        pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n                    }\n                    pp.splice(i, 1);\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            fixM = function (path1, path2, a1, a2, i) {\n                if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                    path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                    a1.bx = 0;\n                    a1.by = 0;\n                    a1.x = path1[i][1];\n                    a1.y = path1[i][2];\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            };\n        for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n            p[i] = processPath(p[i], attrs);\n            fixArc(p, i);\n            p2 && (p2[i] = processPath(p2[i], attrs2));\n            p2 && fixArc(p2, i);\n            fixM(p, p2, attrs, attrs2, i);\n            fixM(p2, p, attrs2, attrs, i);\n            var seg = p[i],\n                seg2 = p2 && p2[i],\n                seglen = seg.length,\n                seg2len = p2 && seg2.length;\n            attrs.x = seg[seglen - 2];\n            attrs.y = seg[seglen - 1];\n            attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n            attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n            attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n            attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n            attrs2.x = p2 && seg2[seg2len - 2];\n            attrs2.y = p2 && seg2[seg2len - 1];\n        }\n        if (!p2) {\n            pth.curve = pathClone(p);\n        }\n        return p2 ? [p, p2] : p;\n    }\n    function mapPath(path, matrix) {\n        if (!matrix) {\n            return path;\n        }\n        var x, y, i, j, ii, jj, pathi;\n        path = path2curve(path);\n        for (i = 0, ii = path.length; i < ii; i++) {\n            pathi = path[i];\n            for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                x = matrix.x(pathi[j], pathi[j + 1]);\n                y = matrix.y(pathi[j], pathi[j + 1]);\n                pathi[j] = x;\n                pathi[j + 1] = y;\n            }\n        }\n        return path;\n    }\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n\n    // export\n    Snap.path = paths;\n\n    /*\\\n     * Snap.path.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the given path in pixels\n     **\n     - path (string) SVG path string\n     **\n     = (number) length\n    \\*/\n    Snap.path.getTotalLength = getTotalLength;\n    /*\\\n     * Snap.path.getPointAtLength\n     [ method ]\n     **\n     * Returns the coordinates of the point located at the given length along the given path\n     **\n     - path (string) SVG path string\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    Snap.path.getPointAtLength = getPointAtLength;\n    /*\\\n     * Snap.path.getSubpath\n     [ method ]\n     **\n     * Returns the subpath of a given path between given start and end lengths\n     **\n     - path (string) SVG path string\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    Snap.path.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the path in pixels (only works for `path` elements)\n     = (number) length\n    \\*/\n    elproto.getTotalLength = function () {\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n    };\n    // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a <path> is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n     **\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        return getPointAtLength(this.attr(\"d\"), length);\n    };\n    // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n     **\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n    };\n    Snap._.box = box;\n    /*\\\n     * Snap.path.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds dot coordinates on the given cubic beziér curve at the given t\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point,\n     o     y: (number) y coordinate of the point,\n     o     m: {\n     o         x: (number) x coordinate of the left anchor,\n     o         y: (number) y coordinate of the left anchor\n     o     },\n     o     n: {\n     o         x: (number) x coordinate of the right anchor,\n     o         y: (number) y coordinate of the right anchor\n     o     },\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve,\n     o         y: (number) y coordinate of the start of the curve\n     o     },\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve,\n     o         y: (number) y coordinate of the end of the curve\n     o     },\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    Snap.path.findDotsAtSegment = findDotsAtSegment;\n    /*\\\n     * Snap.path.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given cubic beziér curve\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for beziér curve\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.bezierBBox = bezierBBox;\n    /*\\\n     * Snap.path.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding box\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point is inside\n    \\*/\n    Snap.path.isPointInsideBBox = isPointInsideBBox;\n    /*\\\n     * Snap.path.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if bounding boxes intersect\n    \\*/\n    Snap.path.isBBoxIntersect = isBBoxIntersect;\n    /*\\\n     * Snap.path.intersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point,\n     o         y: (number) y coordinate of the point,\n     o         t1: (number) t value for segment of path1,\n     o         t2: (number) t value for segment of path2,\n     o         segment1: (number) order number for segment of path1,\n     o         segment2: (number) order number for segment of path2,\n     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    Snap.path.intersection = pathIntersection;\n    Snap.path.intersectionNumber = pathIntersectionNumber;\n    /*\\\n     * Snap.path.isPointInside\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     *\n     * Note: fill mode doesn’t affect the result of this method.\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) `true` if point is inside the path\n    \\*/\n    Snap.path.isPointInside = isPointInsidePath;\n    /*\\\n     * Snap.path.getBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given path\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.getBBox = pathBBox;\n    Snap.path.get = getPath;\n    /*\\\n     * Snap.path.toRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into relative values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toRelative = pathToRelative;\n    /*\\\n     * Snap.path.toAbsolute\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into absolute values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toAbsolute = pathToAbsolute;\n    /*\\\n     * Snap.path.toCubic\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic beziér curves\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments\n    \\*/\n    Snap.path.toCubic = path2curve;\n    /*\\\n     * Snap.path.map\n     [ method ]\n     **\n     * Transform the path string with the given matrix\n     - path (string) path string\n     - matrix (object) see @Matrix\n     = (string) transformed path string\n    \\*/\n    Snap.path.map = mapPath;\n    Snap.path.toString = toString;\n    Snap.path.clone = pathClone;\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var mmax = Math.max,\n        mmin = Math.min;\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i]) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set\n     *\n     * If the function returns `false`, the loop stops running.\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    setproto.remove = function () {\n        while (this.length) {\n            this.pop().remove();\n        }\n        return this;\n    };\n    setproto.attr = function (value) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            this.items[i].attr(value);\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes range of elements from the set\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion… (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found and removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n        return false;\n    };\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin.apply(0, x);\n        y = mmin.apply(0, y);\n        x2 = mmax.apply(0, x2);\n        y2 = mmax.apply(0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y,\n            cx: x + (x2 - x) / 2,\n            cy: y + (y2 - y) / 2\n        };\n    };\n    setproto.clone = function (s) {\n        s = new Set;\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Snap\\u2018s set\";\n    };\n    setproto.type = \"set\";\n    // export\n    Snap.set = function () {\n        var set = new Set;\n        if (arguments.length) {\n            set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n        }\n        return set;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var names = {},\n        reUnit = /[a-z]+$/i,\n        Str = String;\n    names.stroke = names.fill = \"colour\";\n    function getEmpty(item) {\n        var l = item[0];\n        switch (l.toLowerCase()) {\n            case \"t\": return [l, 0, 0];\n            case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n            case \"r\": if (item.length == 4) {\n                return [l, 0, item[2], item[3]];\n            } else {\n                return [l, 0];\n            }\n            case \"s\": if (item.length == 5) {\n                return [l, 1, 1, item[3], item[4]];\n            } else if (item.length == 3) {\n                return [l, 1, 1];\n            } else {\n                return [l, 1];\n            }\n        }\n    }\n    function equaliseTransform(t1, t2, getBBox) {\n        t2 = Str(t2).replace(/\\.{3}|\\u2026/g, t1);\n        t1 = Snap.parseTransformString(t1) || [];\n        t2 = Snap.parseTransformString(t2) || [];\n        var maxlength = Math.max(t1.length, t2.length),\n            from = [],\n            to = [],\n            i = 0, j, jj,\n            tt1, tt2;\n        for (; i < maxlength; i++) {\n            tt1 = t1[i] || getEmpty(t2[i]);\n            tt2 = t2[i] || getEmpty(tt1);\n            if ((tt1[0] != tt2[0]) ||\n                (tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||\n                (tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))\n                ) {\n                    t1 = Snap._.transform2matrix(t1, getBBox());\n                    t2 = Snap._.transform2matrix(t2, getBBox());\n                    from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n                    to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n                    break;\n            }\n            from[i] = [];\n            to[i] = [];\n            for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n                j in tt1 && (from[i][j] = tt1[j]);\n                j in tt2 && (to[i][j] = tt2[j]);\n            }\n        }\n        return {\n            from: path2array(from),\n            to: path2array(to),\n            f: getPath(from)\n        };\n    }\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    function getColour(clr) {\n        return Snap.rgb(clr[0], clr[1], clr[2]);\n    }\n    function getPath(path) {\n        var k = 0, i, ii, j, jj, out, a, b = [];\n        for (i = 0, ii = path.length; i < ii; i++) {\n            out = \"[\";\n            a = ['\"' + path[i][0] + '\"'];\n            for (j = 1, jj = path[i].length; j < jj; j++) {\n                a[j] = \"val[\" + (k++) + \"]\";\n            }\n            out += a + \"]\";\n            b[i] = out;\n        }\n        return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n    }\n    function path2array(path) {\n        var out = [];\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            for (var j = 1, jj = path[i].length; j < jj; j++) {\n                out.push(path[i][j]);\n            }\n        }\n        return out;\n    }\n    Element.prototype.equal = function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this;\n        if (a == +a && b == +b) {\n            return {\n                from: +a,\n                to: +b,\n                f: getNumber\n            };\n        }\n        if (names[name] == \"colour\") {\n            A = Snap.color(a);\n            B = Snap.color(b);\n            return {\n                from: [A.r, A.g, A.b, A.opacity],\n                to: [B.r, B.g, B.b, B.opacity],\n                f: getColour\n            };\n        }\n        if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n            if (b instanceof Snap.Matrix) {\n                b = b.toTransformString();\n            }\n            if (!Snap._.rgTransform.test(b)) {\n                b = Snap._.svgTransform2string(b);\n            }\n            return equaliseTransform(a, b, function () {\n                return el.getBBox(1);\n            });\n        }\n        if (name == \"d\" || name == \"path\") {\n            A = Snap.path.toCubic(a, b);\n            return {\n                from: path2array(A[0]),\n                to: path2array(A[1]),\n                f: getPath(A[0])\n            };\n        }\n        if (name == \"points\") {\n            A = Str(a).split(\",\");\n            B = Str(b).split(\",\");\n            return {\n                from: A,\n                to: B,\n                f: function (val) { return val; }\n            };\n        }\n        var aUnit = a.match(reUnit),\n            bUnit = Str(b).match(reUnit);\n        if (aUnit && aUnit == bUnit) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getUnit(aUnit)\n            };\n        } else {\n            return {\n                from: this.asPX(name),\n                to: this.asPX(name, b),\n                f: getNumber\n            };\n        }\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n    has = \"hasOwnProperty\",\n    supportsTouch = \"createTouch\" in glob.doc,\n    events = [\n        \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n        \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n        \"touchcancel\"\n    ],\n    touchMap = {\n        mousedown: \"touchstart\",\n        mousemove: \"touchmove\",\n        mouseup: \"touchend\"\n    },\n    getScroll = function (xy) {\n        var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\";\n        return glob.doc.documentElement[name] || glob.doc.body[name];\n    },\n    preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    addEvent = (function () {\n        if (glob.doc.addEventListener) {\n            return function (obj, type, fn, element) {\n                var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n                    f = function (e) {\r\n                        var scrollY = getScroll(\"y\"),\n                            scrollX = getScroll(\"x\");\n                        if (supportsTouch && touchMap[has](type)) {\r\n                            for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\r\n                                if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\r\n                                    var olde = e;\n                                    e = e.targetTouches[i];\n                                    e.originalEvent = olde;\n                                    e.preventDefault = preventTouch;\n                                    e.stopPropagation = stopTouch;\n                                    break;\r\n                                }\r\n                            }\r\n                        }\n                        var x = e.clientX + scrollX,\n                            y = e.clientY + scrollY;\n                        return fn.call(element, e, x, y);\r\n                    };\n\n                if (type !== realName) {\r\n                    obj.addEventListener(type, f, false);\r\n                }\n\n                obj.addEventListener(realName, f, false);\n\n                return function () {\n                    if (type !== realName) {\r\n                        obj.removeEventListener(type, f, false);\r\n                    }\n\n                    obj.removeEventListener(realName, f, false);\n                    return true;\n                };\n            };\n        } else if (glob.doc.attachEvent) {\n            return function (obj, type, fn, element) {\n                var f = function (e) {\n                    e = e || glob.win.event;\n                    var scrollY = getScroll(\"y\"),\n                        scrollX = getScroll(\"x\"),\n                        x = e.clientX + scrollX,\n                        y = e.clientY + scrollY;\n                    e.preventDefault = e.preventDefault || preventDefault;\n                    e.stopPropagation = e.stopPropagation || stopPropagation;\n                    return fn.call(element, e, x, y);\n                };\n                obj.attachEvent(\"on\" + type, f);\n                var detacher = function () {\n                    obj.detachEvent(\"on\" + type, f);\n                    return true;\n                };\n                return detacher;\n            };\n        }\n    })(),\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = getScroll(\"y\"),\n            scrollX = getScroll(\"x\"),\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch) {\n                var i = e.touches && e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                glob = Snap._.glob,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            // glob.win.opera && parent.removeChild(node);\n            // node.style.display = \"none\";\n            // o = dragi.el.paper.getElementByPoint(x, y);\n            // node.style.display = display;\n            // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        Snap.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n        }\n        drag = [];\n    };\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds a click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes a click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds a double click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes a double click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds a mousedown event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes a mousedown event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds a mousemove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes a mousemove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds a mouseout event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes a mouseout event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds a mouseover event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes a mouseover event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds a mouseup event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes a mouseup event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds a touchstart event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes a touchstart event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds a touchmove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes a touchmove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds a touchend event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes a touchend event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds a touchcancel event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes a touchcancel event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            Snap[eventName] = elproto[eventName] = function (fn, scope) {\n                if (Snap.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({\n                        name: eventName,\n                        f: fn,\n                        unbind: addEvent(this.shape || this.node || glob.doc, eventName, fn, scope || this)\n                    });\n                }\n                return this;\n            };\n            Snap[\"un\" + eventName] =\n            elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--) if (events[l].name == eventName &&\n                               (events[l].f == fn || !fn)) {\n                    events[l].unbind();\n                    events.splice(l, 1);\n                    !events.length && delete this.events;\n                    return this;\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds hover event handlers to the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes hover event handlers from the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n    // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n    // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n    // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start.<id> on start, drag.end.<id> on end and drag.move.<id> on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for an element's drag gesture\n     **\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionaly following `drag` events are triggered: `drag.start.<id>` on start, \n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element is dragged over another element \n     * `drag.over.<id>` fires as well.\n     *\n     * Start event and start handler are called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler are called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler are called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        if (!arguments.length) {\n            var origTransform;\n            return this.drag(function (dx, dy) {\n                this.attr({\n                    transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n                });\n            }, function () {\n                origTransform = this.transform().local;\n            });\n        }\n        function start(e, x, y) {\n            (e.originalEvent || e).preventDefault();\n            this._drag.x = x;\n            this._drag.y = y;\n            this._drag.id = e.identifier;\n            !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"snap.drag.start.\" + this.id, onstart);\n            onmove && eve.on(\"snap.drag.move.\" + this.id, onmove);\n            onend && eve.on(\"snap.drag.end.\" + this.id, onend);\n            eve(\"snap.drag.start.\" + this.id, start_scope || move_scope || this, x, y, e);\n        }\n        this._drag = {};\n        draggable.push({el: this, start: start});\n        this.mousedown(start);\n        return this;\n    };\n    /*\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut to assign event handler for `drag.over.<id>` event, where `id` is the element's `id` (see @Element.id)\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    // elproto.onDragOver = function (f) {\n    //     f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n    // };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from the given element\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].start);\n            draggable.splice(i, 1);\n            eve.unbind(\"snap.drag.*.\" + this.id);\n        }\n        !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n        return this;\n    };\n});\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        pproto = Paper.prototype,\n        rgurl = /^\\s*url\\((.+)\\)/,\n        Str = String,\n        $ = Snap._.$;\n    Snap.filter = {};\n// SIERRA Paper.filter(): I don't understand the note. Does that mean an HTML should dedicate a separate SVG region for a filter definition? What's the advantage over a DEFS?\n    /*\\\n     * Paper.filter\n     [ method ]\n     **\n     * Creates a `<filter>` element\n     **\n     - filstr (string) SVG fragment of filter provided as a string\n     = (object) @Element\n     * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n     > Usage\n     | var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    pproto.filter = function (filstr) {\n        var paper = this;\n        if (paper.type != \"svg\") {\n            paper = paper.paper;\n        }\n        var f = Snap.parse(Str(filstr)),\n            id = Snap._.id(),\n            width = paper.node.offsetWidth,\n            height = paper.node.offsetHeight,\n            filter = $(\"filter\");\n        $(filter, {\n            id: id,\n            filterUnits: \"userSpaceOnUse\"\n        });\n        filter.appendChild(f.node);\n        paper.defs.appendChild(filter);\n        return new Element(filter);\n    };\n    \n    eve.on(\"snap.util.getattr.filter\", function () {\n        eve.stop();\n        var p = $(this.node, \"filter\");\n        if (p) {\n            var match = Str(p).match(rgurl);\n            return match && Snap.select(match[1]);\n        }\n    });\n    eve.on(\"snap.util.attr.filter\", function (value) {\n        if (value instanceof Element && value.type == \"filter\") {\n            eve.stop();\n            var id = value.node.id;\n            if (!id) {\n                $(value.node, {id: value.id});\n                id = value.id;\n            }\n            $(this.node, {\n                filter: Snap.url(id)\n            });\n        }\n        if (!value || value == \"none\") {\n            eve.stop();\n            this.node.removeAttribute(\"filter\");\n        }\n    });\n    /*\\\n     * Snap.filter.blur\n     [ method ]\n     **\n     * Returns an SVG markup string for the blur filter\n     **\n     - x (number) amount of horizontal blur, in pixels\n     - y (number) #optional amount of vertical blur, in pixels\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.blur(5, 10)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.blur = function (x, y) {\n        if (x == null) {\n            x = 2;\n        }\n        var def = y == null ? x : [x, y];\n        return Snap.format('\\<feGaussianBlur stdDeviation=\"{def}\"/>', {\n            def: def\n        });\n    };\n    Snap.filter.blur.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.shadow\n     [ method ]\n     **\n     * Returns an SVG markup string for the shadow filter\n     **\n     - dx (number) horizontal shift of the shadow, in pixels\n     - dy (number) vertical shift of the shadow, in pixels\n     - blur (number) #optional amount of blur\n     - color (string) #optional color of the shadow\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.shadow(0, 2, 3)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.shadow = function (dx, dy, blur, color) {\n        color = color || \"#000\";\n        if (blur == null) {\n            blur = 4;\n        }\n        if (typeof blur == \"string\") {\n            color = blur;\n            blur = 4;\n        }\n        if (dx == null) {\n            dx = 0;\n            dy = 2;\n        }\n        if (dy == null) {\n            dy = dx;\n        }\n        color = Snap.color(color);\n        return Snap.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>', {\n            color: color,\n            dx: dx,\n            dy: dy,\n            blur: blur\n        });\n    };\n    Snap.filter.shadow.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.grayscale\n     [ method ]\n     **\n     * Returns an SVG markup string for the grayscale filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.grayscale = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>', {\n            a: 0.2126 + 0.7874 * (1 - amount),\n            b: 0.7152 - 0.7152 * (1 - amount),\n            c: 0.0722 - 0.0722 * (1 - amount),\n            d: 0.2126 - 0.2126 * (1 - amount),\n            e: 0.7152 + 0.2848 * (1 - amount),\n            f: 0.0722 - 0.0722 * (1 - amount),\n            g: 0.2126 - 0.2126 * (1 - amount),\n            h: 0.0722 + 0.9278 * (1 - amount)\n        });\n    };\n    Snap.filter.grayscale.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.sepia\n     [ method ]\n     **\n     * Returns an SVG markup string for the sepia filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.sepia = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>', {\n            a: 0.393 + 0.607 * (1 - amount),\n            b: 0.769 - 0.769 * (1 - amount),\n            c: 0.189 - 0.189 * (1 - amount),\n            d: 0.349 - 0.349 * (1 - amount),\n            e: 0.686 + 0.314 * (1 - amount),\n            f: 0.168 - 0.168 * (1 - amount),\n            g: 0.272 - 0.272 * (1 - amount),\n            h: 0.534 - 0.534 * (1 - amount),\n            i: 0.131 + 0.869 * (1 - amount)\n        });\n    };\n    Snap.filter.sepia.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.saturate\n     [ method ]\n     **\n     * Returns an SVG markup string for the saturate filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.saturate = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>', {\n            amount: 1 - amount\n        });\n    };\n    Snap.filter.saturate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.hueRotate\n     [ method ]\n     **\n     * Returns an SVG markup string for the hue-rotate filter\n     **\n     - angle (number) angle of rotation\n     = (string) filter representation\n    \\*/\n    Snap.filter.hueRotate = function (angle) {\n        angle = angle || 0;\n        return Snap.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>', {\n            angle: angle\n        });\n    };\n    Snap.filter.hueRotate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.invert\n     [ method ]\n     **\n     * Returns an SVG markup string for the invert filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.invert = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: 1 - amount\n        });\n    };\n    Snap.filter.invert.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.brightness\n     [ method ]\n     **\n     * Returns an SVG markup string for the brightness filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.brightness = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>', {\n            amount: amount\n        });\n    };\n    Snap.filter.brightness.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.contrast\n     [ method ]\n     **\n     * Returns an SVG markup string for the contrast filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.contrast = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: .5 - amount / 2\n        });\n    };\n    Snap.filter.contrast.toString = function () {\n        return this();\n    };\n});\nreturn Snap;\n}));"
  },
  {
    "path": "demos/snap-ad/src/sass/screen.scss",
    "content": "@import 'compass/css3';\n\n.base-font{\n\tfont-family: 'Open Sans', serif;\n}\n\n.snap-font{\n\tfont-family: 'Source Sans Pro', serif;\n}\n\nbody{\n\tmargin: 0;\n\tcursor: pointer;\n}\n\ntext{\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\nsvg{\n\t@include transform-origin(top, left);\n\t@include transform(scale(1));\n}\n\n#learn-btn{\n\tcursor: pointer;\n\t\n\tpath, text{\n\t\t@include transform(translateY(0));\n\t}\n\t\n\t&:hover{\n\t\tpath{\n\t\t\t&:first-child{\n\t\t\t\tfill: #076656;\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tpath{\n\t\t\t&:nth-child(2){\n\t\t\t\tfill: #7cd1c2;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttext{\n\t\t\tfill: #0a9a87;\n\t\t\t\n\t\t}\n\t};\n\t\n\t&:active{\n\t\tpath{\n\t\t\t&:nth-child(2){\n\t\t\t\t@include transform(translateY(2px));\n\t\t\t}\n\t\t}\n\t\t\n\t\ttext{\n\t\t\t@include transform(translateY(2px));\n\t\t}\n\t}\n}\n\n#replay-btn{\n\t&:hover{\n\t\topacity: 0.5;\n\t};\n}\n\n/*\n@media (max-width: 400px) {\n\tsvg{\n\t\t@include transform(scale(0.375));\n\t}\n}\n*/"
  },
  {
    "path": "demos/snap-mascot/crocodile-1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap</title>\n        <link rel=\"stylesheet\" href=\"style.css\">\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script>\n        window.onload = function () {\n\n            var croc = Snap.select(\"#crocodile\"),\n                head = croc.select(\"#upper-head\"),\n                jaw = croc.select(\"#upper-jaw\"),\n                symbol = croc.select(\"#symbol\"),\n                timer;\n                \n            var pivots = [\n                [44, 147],\n                [92, 126]\n            ];\n\n            function close() {\n                clearTimeout(timer);\n\n                head.animate({ \n                    transform: \"r\" + [8, pivots[0]]\n                }, 500, mina.backin);\n                \n                jaw.animate({\n                    transform: \"r\" + [37, pivots[1]]\n                }, 500, mina.backin);\n\n                timer = setTimeout(function () {\n                    symbol.animate({\n                        transform: \"t-70,40r40\"\n                    }, 100);\n                }, 400);\n            }\n\n            function open() {\n                clearTimeout(timer);\n\n                head.animate({ \n                    transform: \"r\" + [0, pivots[0]]\n                }, 700, mina.elastic);\n                \n                jaw.animate({\n                    transform: \"r\" + [0, pivots[1]]\n                }, 700, mina.elastic);\n\n                symbol.animate({\n                    transform: \"t0,0r0\"\n                }, 500, mina.elastic);\n            }\n\n            timer = setTimeout(close, 50);\n\n            croc.hover(open, \n                function () {\n                    timer = setTimeout(close, 200);\n                }\n            );\n        };\n        </script>\n    </head>\n    <body>\n\n        <svg version=\"1.1\" id=\"crocodile\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"312px\" height=\"300px\" viewBox=\"0 0 260 250\" enable-background=\"new 0 0 260 250\" xml:space=\"preserve\">\n            <g>\n                <path id=\"symbol\" opacity=\"0.2\" fill=\"#848383\" enable-background=\"new    \" d=\"M185.631,140.915l5.02,10.86l8.145-3.765\n                    l-5.02-10.86L185.631,140.915z M246.828,109.341l-47.613,25.306l5.02,10.86l50.123-19.876L246.828,109.341z\"/>\n                <g id=\"head\">\n                    <polygon fill=\"#09B39C\" points=\"44.613,146.703 26.665,140.721 8.718,146.703 -0.252,146.703 -0.252,206.523 44.613,206.523 \n                        119.387,206.523 119.387,167.64      \"/>\n                    <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"-0.252,146.703 11.712,170.631 26.667,140.721 \n                        8.721,146.703       \"/>\n                    <polyline opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"8.718,146.703 20.685,152.685 26.665,140.721      \"/>\n                    <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"44.613,146.703 53.613,163.667 17.694,143.712 \n                        26.667,140.721      \"/>\n                </g>\n                <g id=\"upper-head\">\n                    <g id=\"upper-jaw\">\n                        <g>\n                            <path id=\"upper-teeth\" fill=\"#E0CAB1\" d=\"M151.174,129.382l14.913,6.086l-6.602-14.691L151.174,129.382z M138.707,142.292\n                                l14.914,6.086l-6.603-14.692L138.707,142.292z M126.241,155.201l14.913,6.086l-6.602-14.692L126.241,155.201z M163.64,116.474\n                                l14.913,6.085l-6.603-14.692L163.64,116.474z M176.106,103.564l14.913,6.086l-6.602-14.692L176.106,103.564z M188.572,90.655\n                                l14.914,6.085l-6.602-14.691L188.572,90.655z M201.039,77.746l14.913,6.085L209.35,69.14L201.039,77.746z M221.816,56.23\n                                l-8.311,8.607l14.913,6.085L221.816,56.23z\"/>\n                            <path opacity=\"0.4\" fill=\"#FFFFFF\" enable-background=\"new    \" d=\"M155.329,125.08l10.758,10.388l-6.602-14.691L155.329,125.08\n                                z M142.863,137.989l10.758,10.389l-6.603-14.692L142.863,137.989z M130.396,150.898l10.758,10.389l-6.602-14.692\n                                L130.396,150.898z M167.796,112.171l10.757,10.388l-6.603-14.692L167.796,112.171z M180.261,99.261l10.758,10.389l-6.602-14.692\n                                L180.261,99.261z M192.728,86.352l10.758,10.388l-6.602-14.691L192.728,86.352z M205.195,73.443l10.757,10.388L209.35,69.14\n                                L205.195,73.443z M221.816,56.23l-4.156,4.303l10.758,10.389L221.816,56.23z\"/>\n                        </g>\n                        <polygon fill=\"#09B39C\" points=\"215.135,33 200.18,33 197.189,46.955 92,125 88.355,171.706 106.387,180.64 236.072,47.955             \n                            \"/>\n                        <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"92,125 97.423,150.703 197.189,46.955          \"/>\n                        <line opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" x1=\"197.189\" y1=\"46.955\" x2=\"92\" y2=\"125\"/>\n                        <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"200.18,33 236.072,47.955 215.135,33           \"/>\n                        <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"197.189,46.955 215.135,33 200.18,33           \"/>\n                    </g>\n                    <polygon fill=\"#09B39C\" points=\"92,125 65.55,126.757 44.613,146.703 44.613,176.523 119.387,176.523 119.387,167.64 \n                        107.897,156.377         \"/>\n                    <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"92,125 102.423,145.703 65.55,126.757      \"/>\n                    <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"44.613,146.703 102.423,145.703 92,125 65.55,126.757 \n                                \"/>\n                    <polygon id=\"eye_1_\" fill=\"#FFFFFF\" points=\"71.532,145.703 83.495,139.721 95.459,145.703 80.505,154.676         \"/>\n                    <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"44.613,146.703 44.613,158.667 92,125 65.55,126.757 \n                                \"/>\n                </g>\n                <g id=\"bottom-jaw\">\n                    <g>\n                        <polygon fill=\"#E0CAB1\" points=\"152.531,185.586 158.513,170.631 164.495,185.586             \"/>\n                        <polygon opacity=\"0.4\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"164.495,185.586 158.513,170.631 158.513,185.586           \n                            \"/>\n                    </g>\n                    <g>\n                        <polygon fill=\"#E0CAB1\" points=\"170.477,185.586 176.459,170.631 182.441,185.586             \"/>\n                        <polygon opacity=\"0.4\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"182.441,185.586 176.459,170.631 176.459,185.586           \n                            \"/>\n                    </g>\n                    <g>\n                        <polygon fill=\"#E0CAB1\" points=\"188.423,185.586 194.405,170.631 200.387,185.586             \"/>\n                        <polygon opacity=\"0.4\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"200.387,185.586 194.405,170.631 194.405,185.586           \n                            \"/>\n                    </g>\n                    <g>\n                        <polygon fill=\"#E0CAB1\" points=\"206.369,185.586 212.351,170.631 218.333,185.586             \"/>\n                        <polygon opacity=\"0.4\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"218.333,185.586 212.351,170.631 212.351,185.586           \n                            \"/>\n                    </g>\n                    <g>\n                        <polygon fill=\"#E0CAB1\" points=\"224.315,185.586 230.297,170.631 236.279,185.586             \"/>\n                        <polygon opacity=\"0.4\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"236.279,185.586 230.297,170.631 230.297,185.586           \n                            \"/>\n                    </g>\n                    <polygon fill=\"#E0CAB1\" points=\"148.54,179.604 119.596,167.64 109.657,167.64 103.675,167.64 91.711,167.64 79.747,179.604 \n                        0,200.541 0,206.523 79.747,206.523 156.522,206.523 187.432,198.55 235.288,189.577 244.252,179.604       \"/>\n                    <polygon opacity=\"0.3\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"119.594,167.64 91.711,167.64 79.747,179.604       \"/>\n                    <polygon opacity=\"0.3\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"91.711,167.64 79.747,206.523 79.747,179.604       \"/>\n                    <polygon opacity=\"0.1\" fill=\"#534741\" enable-background=\"new    \" points=\"235.288,189.577 160.513,195.559 115.639,206.523 \n                        156.522,206.523 187.432,198.55      \"/>\n                    <polygon opacity=\"0.1\" fill=\"#534741\" enable-background=\"new    \" points=\"187.432,198.55 160.513,195.559 156.522,206.523 \n                        156.522,206.523         \"/>\n                    <polygon opacity=\"0.3\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"0,200.541 46.847,194.559 79.747,179.604       \"/>\n                </g>\n            </g>\n        </svg>\n\n    </body>\n</html>"
  },
  {
    "path": "demos/snap-mascot/crocodile-2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap</title>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <link rel=\"stylesheet\" href=\"style.css\">\n        <script>\n        window.onload = function () {\n\n            var diagramgroup = Snap.select(\"#crocodile-2\"),\n                elements = {},\n                elementkeys = ['map', 'pie', 'eye'],\n                diagramtimer = [],\n                animating = {},\n                cleartimers = {},\n                i = 0, j = 0;\n\n            function show(key) {\n                if (animating[key]) return;\n                clearTimeout(cleartimers[key]);\n                animating[key] = true;\n                var element = elements[key],\n                x = element[0].getBBox().x,\n                offset = x/2 + 25;\n                element[0].attr({\n                    transform: \"t\"+offset+\",80s0.5,0.5,0,0\"\n                });\n                setTimeout(function() {\n                    element[0].animate({opacity:1,transform:\"t0,0s1,1,0,0\"}, 500, mina.elastic);\n                }, 50);\n                element[1].animate({opacity:0.25}, 400);\n                setTimeout(function(){animating[key] = false}, 550);\n            }\n\n            function showAll() {\n                j = 0;\n                function cycle() {\n                    show(elementkeys[j]);\n                    j++;\n                    if (j < elementkeys.length) setTimeout(cycle, 200);\n                }\n                cycle();\n            }\n\n            function hoverIn() {\n                show( this.node.id.replace('hit-', '') );\n            }\n\n\n            for (i = 0; i < elementkeys.length; i++) {\n                var key = elementkeys[i],\n                diagram = diagramgroup.select(\"#diagram-\" + key).attr({opacity:0}),\n                path = diagramgroup.select(\"#path-\" + key).attr({opacity:0}),\n                hitarea = diagramgroup.select(\"#hit-\" + key);\n                hitarea.hover(hoverIn);\n                elements[key] = [diagram, path];\n            }\n\n            diagramtimer = setTimeout(showAll, 250);\n\n\n        };\n        </script>\n    </head>\n    <body>\n\n        <svg version=\"1.1\" id=\"crocodile-2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" width=\"375px\" height=\"300px\" viewBox=\"0 0 500 400\" enable-background=\"new 0 0 500 400\" xml:space=\"preserve\">\n            <g id=\"croc\">\n                \n                    <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"-352.022\" y1=\"820.576\" x2=\"-352.022\" y2=\"919.5\" gradientTransform=\"matrix(-1 0 0 1 79 -537.5)\">\n                    <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.25\"/>\n                    <stop  offset=\"0.7074\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                </linearGradient>\n                <polygon fill=\"url(#SVGID_1_)\" points=\"828.78,382 766.953,320.172 424.839,283.076 33.264,309.868 105.396,382    \"/>\n                <polygon fill=\"#00A99D\" points=\"717.49,299.563 639.175,287.198 597.957,274.832 581.47,274.832 527.886,258.345 499.033,250.101 \n                    424.839,237.735 363.012,237.735 330.037,245.979 272.331,250.101 255.844,245.979 218.747,254.223 198.138,254.223 \n                    169.285,262.466 169.02,262.528 168.718,262.466 150.365,258.345 132.031,258.345 120.695,270.535 49.639,291.805 39.562,289.472 \n                    33.264,295.441 33.264,309.413 37.204,309.346 43.291,316.495 72.885,318.333 91.381,320.172 137.62,319.364 153.768,319.364 \n                    161.041,320.172 210.503,320.172 198.138,332.538 239.356,332.538 247.6,328.416 251.722,320.172 276.453,320.172 325.915,324.294 \n                    381.312,320.337 375.377,324.294 363.012,332.538 416.596,332.538 424.839,328.416 430.335,320.172 441.327,320.172 \n                    503.154,316.05 532.007,320.172 614.437,324.294 635.066,324.294 672.15,320.172 766.953,320.172   \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"346.524,258.345 330.037,245.979 363.012,237.735  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"717.49,299.563 721.612,311.929 655.663,303.685 \n                    597.957,291.319 569.104,295.441 494.911,274.832 499.033,250.101 527.886,258.345 581.47,274.832 597.957,274.832 \n                    639.175,287.198     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"499.033,250.101 433.083,250.101 424.839,237.735  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"527.885,258.345 494.911,274.832 433.083,250.101 \n                    363.012,237.735 424.839,237.735 499.033,250.101     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"597.957,274.832 597.957,291.319 581.47,274.832   \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"527.885,258.345 569.104,295.441 581.47,274.832   \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"527.885,258.345 494.911,274.832 437.205,262.466 \n                    420.718,274.832 346.524,258.345 272.331,250.101 330.037,245.979 363.012,237.735 424.839,237.735 499.033,250.101     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"433.083,250.101 420.718,274.832 346.524,258.345 \n                    309.428,278.954 272.331,262.466 255.844,245.979 272.331,250.101 330.037,245.979 363.012,237.735 424.839,237.735 \n                    499.033,250.101     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"272.331,250.101 272.331,262.466 218.747,254.223 \n                    255.844,245.979     \"/>\n                <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"120.695,270.534 123.127,285.425 49.638,291.805    \"/>\n                <polyline opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"49.638,291.805 62.343,298.568 120.695,270.534    \"/>\n                <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"120.695,270.534 120.695,270.534 123.127,285.425 \n                    132.031,258.345     \"/>\n                <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"150.365,258.345 123.127,285.425 120.695,270.534 \n                    132.031,258.345     \"/>\n                <polygon fill=\"#FFFFFF\" points=\"141.617,267.138 137.495,271.26 145.739,271.26 149.861,268.676   \"/>\n                <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"150.365,258.345 168.718,262.642 119.911,270.71 \n                    132.031,258.345     \"/>\n                <polygon opacity=\"0.2\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"49.638,291.805 33.264,295.441 39.562,289.472  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"161.041,311.929 140.432,299.563 107.457,299.563 \n                    123.945,295.441 144.554,295.441     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"144.554,295.441 123.945,295.441 140.432,299.563  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"255.844,245.979 218.747,254.223 218.747,262.466 \n                    198.138,254.223 218.747,254.223     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"218.747,254.223 218.747,262.466 169.285,270.71 \n                    132.598,258.345 152.798,258.345 169.285,262.466 198.138,254.223     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"330.037,245.979 272.331,262.466 247.6,278.954 \n                    218.747,262.466 169.285,283.076 169.285,262.466 198.138,254.223 218.747,254.223 255.844,245.979 272.331,250.101     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"259.966,278.954 247.6,291.319 235.235,287.198    \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"280.575,287.198 247.6,291.319 226.991,316.05 \n                    235.235,287.198 259.966,278.954     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"210.503,320.172 206.382,332.538 198.138,332.538  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"226.991,316.05 235.235,320.172 210.503,320.172   \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"288.819,299.563 280.575,287.198 259.966,278.954 \n                    235.235,287.198 247.6,291.319 259.966,278.954   \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"235.235,287.198 235.235,320.172 218.747,332.538 \n                    206.382,332.538 198.138,332.538 210.503,320.172 226.991,316.05  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"466.058,270.71 445.449,287.198 433.083,278.954   \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"420.718,287.198 445.449,287.198 486.667,287.198 \n                    466.058,270.71 433.083,278.954  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"404.23,311.929 445.449,287.198 466.058,270.71 \n                    433.083,278.954 420.718,287.198     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"387.743,316.05 416.596,320.172 404.23,311.929    \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"379.499,332.538 375.377,324.294 363.012,332.538  \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"387.743,316.05 379.499,332.538 363.012,332.538 \n                    375.377,324.294     \"/>\n                <polygon opacity=\"0.15\" fill=\"#FFFFFF\" enable-background=\"new    \" points=\"416.596,320.172 379.499,332.538 363.012,332.538 \n                    375.377,324.294 387.743,316.05 404.23,311.929 420.718,287.198   \"/>\n            </g>\n            <polyline id=\"path-eye\" opacity=\"0.25\" fill=\"none\" stroke=\"#000000\" stroke-width=\"2\" stroke-miterlimit=\"10\" enable-background=\"new    \" points=\"\n                121.714,247.568 66.427,193.472 66.427,149.497 \"/>\n            <polyline id=\"path-pie\" opacity=\"0.25\" fill=\"none\" stroke=\"#000000\" stroke-width=\"2\" stroke-miterlimit=\"10\" enable-background=\"new    \" points=\"\n                272.069,237.568 226.782,193.472 226.782,155.497 \"/>\n            <polyline id=\"path-map\" opacity=\"0.25\" fill=\"none\" stroke=\"#000000\" stroke-width=\"2\" stroke-miterlimit=\"10\" enable-background=\"new    \" points=\"\n                412.069,227.568 376.782,193.472 376.782,145.497 \"/>\n            <g id=\"diagram-eye\">\n                \n                    <linearGradient id=\"SVGID_2_\" gradientUnits=\"userSpaceOnUse\" x1=\"238.8165\" y1=\"619.2575\" x2=\"320.3815\" y2=\"700.8225\" gradientTransform=\"matrix(1 0 0 1 -171 -537.5)\">\n                    <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.15\"/>\n                    <stop  offset=\"0.9331\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                </linearGradient>\n                <polygon fill=\"url(#SVGID_2_)\" points=\"91.848,220.855 10.283,139.291 125.35,24.224 206.915,105.789  \"/>\n                <rect x=\"10\" y=\"24.507\" fill=\"#00A99D\" width=\"115.35\" height=\"115.35\"/>\n                <g>\n                    <g>\n                        <g>\n                            <g>\n                                <g>\n                                    <defs>\n                                        <rect id=\"SVGID_3_\" x=\"10\" y=\"24.507\" width=\"115.35\" height=\"115.35\"/>\n                                    </defs>\n                                    <clipPath id=\"SVGID_4_\">\n                                        <use xlink:href=\"#SVGID_3_\"  overflow=\"visible\"/>\n                                    </clipPath>\n                                    \n                                        <linearGradient id=\"SVGID_5_\" gradientUnits=\"userSpaceOnUse\" x1=\"-288.3424\" y1=\"535.6428\" x2=\"-205.4552\" y2=\"618.5298\" gradientTransform=\"matrix(0.5689 0.1954 0.1954 0.5689 124.387 -168.8858)\">\n                                        <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.25\"/>\n                                        <stop  offset=\"1\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                                    </linearGradient>\n                                    <polygon clip-path=\"url(#SVGID_4_)\" fill=\"url(#SVGID_5_)\" points=\"106.408,162.927 44.068,100.445 96.512,68.965 \n                                        149.381,121.833                         \"/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n                <path fill=\"#60C6BA\" d=\"M28.023,82.182c0,0,18.023-28.837,39.652-28.837s39.652,28.837,39.652,28.837s-18.023,28.837-39.652,28.837\n                    S28.023,82.182,28.023,82.182z\"/>\n                <g>\n                    <circle fill=\"#9BEADF\" cx=\"67.675\" cy=\"82.182\" r=\"24.031\"/>\n                </g>\n                <path fill=\"#00A99D\" d=\"M67.675,65.017c0,0,3.433,6.866,3.433,17.165s-3.433,17.165-3.433,17.165s-3.433-6.866-3.433-17.165\n                    S67.675,65.017,67.675,65.017z\"/>\n                <circle opacity=\"0.5\" fill=\"#FFFFFF\" enable-background=\"new    \" cx=\"57.921\" cy=\"67.48\" r=\"4.806\"/>\n                <circle opacity=\"0.5\" fill=\"#FFFFFF\" enable-background=\"new    \" cx=\"50.712\" cy=\"74.689\" r=\"2.403\"/>\n            </g>\n            <g id=\"diagram-pie\">\n                \n                    <linearGradient id=\"SVGID_6_\" gradientUnits=\"userSpaceOnUse\" x1=\"400.0527\" y1=\"624.0652\" x2=\"473.0262\" y2=\"697.0389\" gradientTransform=\"matrix(1 0 0 1 -171 -537.5)\">\n                    <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.25\"/>\n                    <stop  offset=\"0.9\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                </linearGradient>\n                <path fill=\"url(#SVGID_6_)\" d=\"M272.351,43.267l-86.596,86.597l72.973,72.973l86.596-86.596L272.351,43.267z\"/>\n                <circle fill=\"#60C6BA\" cx=\"226.973\" cy=\"83.304\" r=\"61.828\"/>\n                <path fill=\"#00A99D\" d=\"M197.727,137.784c8.708,4.684,18.665,7.347,29.246,7.347c34.146,0,61.828-27.681,61.828-61.828\n                    s-27.681-61.828-61.828-61.828v59.767L197.727,137.784z\"/>\n                <g>\n                    <g>\n                        <g>\n                            <g>\n                                <g>\n                                    <defs>\n                                        <circle id=\"SVGID_7_\" cx=\"226.973\" cy=\"83.304\" r=\"61.828\"/>\n                                    </defs>\n                                    <clipPath id=\"SVGID_8_\">\n                                        <use xlink:href=\"#SVGID_7_\"  overflow=\"visible\"/>\n                                    </clipPath>\n                                    \n                                        <linearGradient id=\"SVGID_9_\" gradientUnits=\"userSpaceOnUse\" x1=\"397.6839\" y1=\"619.334\" x2=\"444.7831\" y2=\"666.433\" gradientTransform=\"matrix(1 0 0 1 -171 -537.5)\">\n                                        <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.25\"/>\n                                        <stop  offset=\"1\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                                    </linearGradient>\n                                    <path clip-path=\"url(#SVGID_8_)\" fill=\"url(#SVGID_9_)\" d=\"M258.189,50.329l-4.726,4.726\n                                        c6.853,6.853,11.092,16.321,11.092,26.779c0,20.916-16.955,37.871-37.871,37.871c-10.458,0-19.926-4.239-26.779-11.092\n                                        l-4.726,4.726l47.099,47.099l63.009-63.009L258.189,50.329z\"/>\n                                </g>\n                            </g>\n                        </g>\n                    </g>\n                </g>\n                <path fill=\"#9BEADF\" d=\"M226.973,83.304V21.476c-9.586,0-18.663,2.183-26.76,6.077L226.973,83.304z\"/>\n                <circle fill=\"#60C6BA\" cx=\"226.973\" cy=\"83.304\" r=\"45.34\"/>\n                <path fill=\"#00A99D\" d=\"M272.313,83.304c0-25.041-20.3-45.34-45.34-45.34v90.681C252.013,128.644,272.313,108.345,272.313,83.304z\"\n                    />\n                <path fill=\"#9BEADF\" d=\"M184.162,68.37l42.811,14.934v-45.34C207.166,37.963,190.337,50.669,184.162,68.37z\"/>\n            </g>\n            <g id=\"diagram-map\">\n                \n                    <linearGradient id=\"SVGID_10_\" gradientUnits=\"userSpaceOnUse\" x1=\"505.6437\" y1=\"570.8013\" x2=\"608.6902\" y2=\"673.8477\" gradientTransform=\"matrix(1 0 0 1 -171 -537.5)\">\n                    <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.25\"/>\n                    <stop  offset=\"1\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                </linearGradient>\n                <polygon fill=\"url(#SVGID_10_)\" points=\"387.104,186.934 330.897,130.727 334.644,33.301 432.069,29.554 488.276,85.761    \"/>\n                <path fill=\"#60C6BA\" d=\"M435.816,117.612c0,9.313-7.549,16.862-16.862,16.862h-78.69c-9.313,0-16.862-7.549-16.862-16.862v-78.69\n                    c0-9.313,7.549-16.862,16.862-16.862h78.69c9.313,0,16.862,7.549,16.862,16.862V117.612z\"/>\n                <g>\n                    <path fill=\"#00A99D\" d=\"M412.875,101.541c-0.173,1.625-0.483,1.955,1.618,1.847C414.559,102.355,414.023,101.464,412.875,101.541\n                        C412.822,102.037,414.083,101.46,412.875,101.541z M425.12,118.865c0.869-1.597-3.166-1.674-3.927-1.848\n                        c0.801-2.307-0.758-1.445-2.301-1.944c-0.981-0.317-2.751-2.095-3.72-2.83c-1.12-0.849-2.495-0.625-3.695-1.162\n                        c-1.639-0.734-1.6-2.245-3.661-2.818c-1.15-0.319-4.17,0.105-4.623-0.454c-0.808-0.996-2.685-0.572-3.697-0.255\n                        c-1.204,0.376-2.472,1.029-3.236,2.068c-0.416,0.566-1.26,2.358-1.168,2.545c0.776-0.172,8.085-5.264,8.085-2.542\n                        c0,1.436,4.053,1.143,4.328,2.108c0.547,1.92,3.575,1.939,5.144,1.819c-0.561,2.424,2.1,3.612,3.927,4.158\n                        c-0.159,0.952-1.499,1.761-1.156,2.771C417.782,120.22,423.477,120.739,425.12,118.865\n                        C425.957,117.328,424.645,119.407,425.12,118.865z M395.784,80.974c2.509,0.069,1.327,2.668,3.205,3.107\n                        c1.935,0.453-0.559,5.006,0.952,6.131c0.372-0.824,0.346-1.347,1.385-1.155c-0.047,1.523-1.881,2.833-0.23,4.158\n                        c0.298,0.492,1.155,0.373,1.155,1.155c0,1.539,2.068,4.913,3.927,5.543c0.575-2.302,1.155-4.685,1.155-6.365\n                        c0-1.209-0.534-4.18-1.617-4.722c0.234-1.168,0.235-0.913,0-1.617c-1.028-0.69-0.525-1.354-0.692-2.311\n                        c-0.154-0.88-0.925-2.092-0.925-3.601c0-0.721-1.258-1.364-0.991-2.097c0.381-1.047,0.734-0.752,0.53-2.386\n                        c-0.003,0.008,1.055-2.113,1.155-2.31c-0.512-1.531,2.031-2.269,2.31-3.927c1.698,0.566,1.654-1.618,2.541-1.618\n                        c0.788,0,0.751-1.144,0.924-1.848c1.387,0.347,1.32-0.378,2.541-0.924c1.275-0.651,2.202-2.903,3.696-3.234\n                        c-0.136-0.579-0.367-1.118-0.692-1.617c0.854,0.015,1.187-0.092,1.617-0.462c-0.15-0.595-0.834-1.288-1.155-1.617\n                        c0.57,0.157,1.109,0.08,1.617-0.231c0.407,1.22,1.495,0.917,2.079,0.001c-0.588-0.451-0.413-0.236-0.923-0.924\n                        c-2.706-0.516-1.321-0.662,0.231-1.616c-0.508-1.524-0.092-1.592-1.791-2.426c-0.48-0.236-0.99-1.303-1.212-1.731\n                        c0.616-0.077,1.232-0.154,1.848-0.231c-0.155-0.74-0.927-1.502-1.387-1.848c0.231,0,0.463,0,0.694,0\n                        c-0.272-0.855-1.376-1.159-1.617-2.079c0.231,0,0.461,0,0.692,0c-0.252-1.762,0.278-1.826,0.693-3.696\n                        c0.709,0.076,0.709-0.463,0-1.617c1.639-0.328,0.885-0.792,2.541-0.462c0.214-0.626-0.062-0.534,0.463-0.923\n                        c0.867,1.135-1.279,2.217-1.617,3.232c0.154,0,0.308,0,0.462,0c-1.142,0.548-1.308,3.691-0.692,4.158\n                        c0.473,0.359,2.247-1.061,1.616,1.155c1.652-0.881,1.439-0.474,1.848-1.848c0.158-0.533,0.368-0.674,0.462-1.387\n                        c0.103-0.818-1.031-2.294-0.924-3.927c0.761,0.339,1.825,1.343,2.773,0.923c1.198-0.58,0.322-2.588,1.848-2.079\n                        c0.399-1.329,0.309-4.388-0.001-4.388c0.589,0,1.487-2.163,2.078-2.541c0.9-0.576,2.577-0.124,3.003-1.387\n                        c1.198-0.054,2.052,0.555,2.54,0.231h0.231c0.197-0.515-0.382-0.574-0.462-0.924h0.231c0.151-0.347,0.186-0.377,0.231-0.923\n                        c0.028,0.006,0.057,0.011,0.085,0.017c-2.69-5.74-8.502-9.725-15.261-9.725h-78.69c-9.313,0-16.862,7.549-16.862,16.862v61.411\n                        c0.458,0.918,1.198,2.159,1.477,2.364c1.681,0.128,2.141,3.274,3.465,4.157c0.577,1.067,0.775,2.05,1.617,3.233\n                        c1.367,0.688,2.337,7.623,1.154,7.623c-1.059,0,1.12,6.006,3.004,6.006c0.52,0,2.246,1.595,2.77,2.077\n                        c0.742,0.577,0.698,1.476,1.617,2.08c0.316,0.204,1.355,0.566,1.847,0.693c3.485,0.901,6.774,5.433,10.857,4.619\n                        c0.077,0.231,0.154,0.462,0.231,0.693c0.995,0.053,0.783,0.142,1.386,0.462v0.134h29.595c0.209-0.462-0.014-0.922,0.199-1.524\n                        c0.298-0.276,1.803-5.585-0.229-5.775c0.296-0.644,0.87-1.52,1.155-1.848c0.112,0.498,0.035,0.96-0.231,1.386\n                        c2.802,0.691,0.126-0.015,0.924,0.692c0.154,0,0.307,0,0.461,0c-0.322-2.284,1.188-4.774,0.654-6.635\n                        c-0.335-1.168,1.194-2.637,1.194-3.528c0-1.734,0.816-2.275-0.924-3.233c-0.694-0.382-1.948-0.727-3.234,0\n                        c-2.284,3.036-5.775,0.71-5.775,6.072c0,1.772-2.141,5.815-3.927,6.167c-0.333-0.267-0.576-0.568-0.693-0.923\n                        c-0.542,0.181-1.804,0.217-2.238,0.526c-0.244,0.173-0.924,1.288-0.996,1.321c-0.92-0.453-2.549,0.335-3.552,0.408\n                        c-1.738,0.126-1.403-2.025-3.031-2.025c-2.078,0-1.885-0.493-2.893-2.494c-0.721-1.432-0.569-2.181-2.075-3.05\n                        c-0.257-0.257-0.254-0.6-0.461-0.924c-0.567-0.888-1.997-2.877-2.079-4.156c-0.198,0.127-0.568,0.36-0.692,0.462\n                        c0.316-1.902,0.693-4.139,0.692-5.775c0-0.996-0.947-2.768-0.678-3.571c0.325-0.972-0.078-2.736-0.015-3.357\n                        c-0.317-1.908,0.494-1.278,0.692-3.004c0.212-0.369,1.095-0.273,1.467-1.403c0.323-0.98,0.135-0.973-0.544-1.138\n                        c0.512-1.53-0.621-1.696-0.924-3.002c-0.274-1.181-0.879-3.683,0.461-3.234c0.399-1.043,0.425-3.002,1.849-3.002\n                        c1.109,0,1.63-0.648,1.385-1.617c1.057-0.677,2.649-0.532,3.464-1.155c0.065-1.455,1.375-1.531,0.925-3.003\n                        c0.285,0.095,1.319,0.703,1.385,0.693c0.705-0.106,2.3-0.59,2.079-1.617c0.962,0.485,1.113-0.14,1.848,0\n                        c0.005,0,2.327,0.773,1.848,0.693c0.46,0.104,0.876-0.271,1.617-0.463c-0.211,1.814,1.416,1.576,2.541,0.923\n                        c0,0.154,0,0.308,0,0.462c-2.585,1.273,2.05,1.263,2.54,1.385c-0.253-0.934-0.693-1.484,0.231-2.309\n                        c0.628,0.173,3.465,2.134,3.465,2.308c0,0.726,0.493,0.553,0.924,0.232c-0.194-0.973-2.545-2.14-0.23-2.541\n                        c-0.047-0.174-0.433-1.023-0.693-0.925c-1.103,0.498-0.558-0.805-2.079-0.231c-0.159-0.163-0.461-0.61-0.692-0.923\n                        c0.769-0.104,1.539-0.104,2.31,0c-0.053-0.479,0.108-0.734,0.484-0.766c0.406-0.116,1.422-0.167,1.364-0.159\n                        c0.818-0.111,2.554,1.765,2.309-0.462c0.154,0,0.308,0,0.462,0c0.353,2.143,1.659,1.379,2.078,0.001\n                        c0.584,1.551,1.801,0.262,3.004,0.462c-0.496,1.646,1.971,1.348,2.541,2.772c0.799,0.348,1.109,0.703,2.078,0.461\n                        c-0.381,0.052,2.847-1.321,2.667-0.991C396.719,81.347,395.595,81.32,395.784,80.974\n                        C398.309,81.043,395.457,81.572,395.784,80.974z M428.351,115.631c0.024-0.304-0.19-0.311-0.461-0.231\n                        C428.152,115.658,427.888,115.498,428.351,115.631z M399.478,112.396c0.78,0.312,0.3,1.138-0.462,1.618\n                        C402.647,115.73,399.785,108.812,399.478,112.396z M434.824,120.714c-0.447-0.188-1.037,0.024-1.386,0.462\n                        c-1.893,0.693-2.513-1.081-4.39-0.694c1.479,1.363,0.753,1.063,1.385,2.772c0.088,0.149,1.346,2.124,0.709,2.146\n                        c-0.981,0.035-2.859-0.336-3.845-0.597c-1.739-0.46-3.358,1.223-1.391,1.38c2.47,0.198,4.858,0.304,7.367,0.304\n                        c1.102-1.774,1.884-3.761,2.265-5.893C435.299,120.634,435.062,120.674,434.824,120.714\n                        C434.377,120.526,435.062,120.674,434.824,120.714z M418.188,125.793c-0.611-1.214-4.706-1.446-5.446-0.186\n                        c-0.362,0.616,5.189,3.353,6.758,1.667C419.879,126.867,418.13,125.748,418.188,125.793\n                        C417.857,125.135,418.525,126.058,418.188,125.793z\"/>\n                </g>\n                \n                    <linearGradient id=\"SVGID_11_\" gradientUnits=\"userSpaceOnUse\" x1=\"548.6378\" y1=\"585.9402\" x2=\"596.8632\" y2=\"634.1658\" gradientTransform=\"matrix(1 0 0 1 -171 -537.5)\">\n                    <stop  offset=\"0\" style=\"stop-color:#000000;stop-opacity:0.25\"/>\n                    <stop  offset=\"0.7305\" style=\"stop-color:#000000;stop-opacity:0.0245\"/>\n                    <stop  offset=\"0.9282\" style=\"stop-color:#000000;stop-opacity:0\"/>\n                </linearGradient>\n                <polygon fill=\"url(#SVGID_11_)\" points=\"413.91,108.619 377.844,71.522 389.591,36.487 434.519,83.888     \"/>\n                <path fill=\"#9BEADF\" d=\"M391.297,48.623h-0.169c0.508-1.435,0.799-2.971,0.799-4.58c0-7.588-6.151-13.739-13.739-13.739\n                    s-13.739,6.151-13.739,13.739c0,1.608,0.291,3.145,0.799,4.58h-0.169l0.504,0.88c0.395,0.911,0.892,1.764,1.466,2.56l11.14,19.459\n                    l11.14-19.459c0.574-0.796,1.071-1.649,1.466-2.56L391.297,48.623z M373.607,44.043c0-2.529,2.051-4.58,4.58-4.58\n                    s4.58,2.05,4.58,4.58c0,2.529-2.051,4.58-4.58,4.58S373.607,46.572,373.607,44.043z\"/>\n            </g>\n            <rect id=\"hit-eye\" x=\"6.5\" y=\"22.061\" opacity=\"0\" fill=\"#FF0000\" width=\"122.667\" height=\"123.071\"/>\n            <rect id=\"hit-pie\" x=\"165.658\" y=\"22.061\" opacity=\"0\" fill=\"#FF0000\" width=\"122.667\" height=\"123.071\"/>\n            <rect id=\"hit-map\" x=\"316.855\" y=\"22.061\" opacity=\"0\" fill=\"#FF0000\" width=\"122.667\" height=\"123.071\"/>\n            </svg>\n\n    </body>\n</html>"
  },
  {
    "path": "demos/snap-mascot/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap</title>\n        <link rel=\"stylesheet\" href=\"style.css\">\n    </head>\n    <body>\n        <iframe src=\"crocodile-1.html\" ></iframe>\n        <br>\n        <iframe src=\"snap-logo.html\" ></iframe>\n        <iframe src=\"crocodile-2.html\" ></iframe>\n    </body>\n</html>"
  },
  {
    "path": "demos/snap-mascot/snap-logo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright © 2013 Adobe Systems Incorporated. All rights reserved.\n \n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap</title>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <link rel=\"stylesheet\" href=\"style.css\">\n        <script>\n        window.onload = function () {\n\n            var logo = Snap.select(\"#snap-logo\"),\n                parts = [\n                    [\"top\", [0, 20]], \n                    [\"left\", [20, 0]], \n                    [\"bottom\", [0, -20]],\n                    [\"right\", [-20, 0]]\n                ],\n                i = 0,\n                showTimer = null,\n                hideTimer = null;\n\n            for (i = 0; i < parts.length; i++) {\n                var el = parts[i],\n                element = logo.select(\"#\" + el[0]);\n                element.attr({\n                    opacity: 0,\n                    transform: \"t\" + el[1]\n                });\n                parts[i].push(element);\n            }\n\n            i = 0;\n\n            function showEach() {\n                clearTimeout(hideTimer);\n                if (i >= parts.length) return;\n                parts[i][2].animate({ \n                    transform: \"t0,0\",\n                    opacity: 1\n                }, 200, mina.easeout);\n                showTimer = setTimeout(showEach, 200);\n                i++;\n                if (i >= parts.length) i = parts.length-1;\n            }\n\n            function hideEach() {\n                clearTimeout(showTimer);\n                if (i < 0) return;\n                parts[i][2].animate({ \n                    transform: \"t\" + parts[i][1],\n                    opacity: 0\n                }, 200, mina.easeout);\n                hideTimer = setTimeout(hideEach, 200);\n                i--;\n                if (i < 0) i = 0;\n            }\n\n            setTimeout(function () {\n                logo.attr({\n                    display: \"inline\"\n                });\n                showEach();\n            }, 100);\n\n            logo.hover(hideEach, showEach);\n\n        };\n        </script>\n    </head>\n    <body>\n\n\n\n        <svg version=\"1.1\" id=\"snap-logo\" xmlns=\"http://www.w3.org/2000/svg\" \n            xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n            width=\"250px\" height=\"250px\">\n            <defs>\n                <linearGradient id=\"bottom_1_\" gradientUnits=\"userSpaceOnUse\" \n                    x1=\"196\" y1=\"485.6281\" x2=\"196\" y2=\"732.5812\" \n                    gradientTransform=\"matrix(1 0 0 1 -71 -486.5)\">\n                    <stop  offset=\"0\" stop-color=\"#002E3B\"/>\n                    <stop  offset=\"1\" stop-color=\"#002639\"/>\n                </linearGradient>\n                <radialGradient id=\"right_2_\" cx=\"146.3819\" cy=\"449.8799\" \n                    r=\"408.7811\" gradientTransform=\"matrix(1 0 0 1 -71 -486.5)\" \n                    gradientUnits=\"userSpaceOnUse\">\n                    <stop  offset=\"0\" stop-color=\"#00BC85\"/>\n                    <stop  offset=\"1\" stop-color=\"#149D91\"/>\n                </radialGradient>\n                <radialGradient id=\"left_1_\" cx=\"139.0562\" cy=\"454.2622\" \n                    r=\"507.5908\" gradientTransform=\"matrix(1 0 0 1 -71 -486.5)\" \n                    gradientUnits=\"userSpaceOnUse\">\n                    <stop  offset=\"0\" stop-color=\"#004473\"/>\n                    <stop  offset=\"1\" stop-color=\"#00345F\"/>\n                </radialGradient>\n                <linearGradient id=\"top_1_\" gradientUnits=\"userSpaceOnUse\" \n                    x1=\"195.922\" y1=\"486.8864\" x2=\"195.922\" y2=\"732.5903\" \n                    gradientTransform=\"matrix(1 0 0 1 -71 -486.5)\">\n                    <stop  offset=\"0\" stop-color=\"#002E3B\"/>\n                    <stop  offset=\"1\" stop-color=\"#002639\"/>\n                </linearGradient>\n                </defs>\n            <polygon id=\"bottom\" fill=\"url(#bottom_1_)\" stroke=\"url(#bottom_1_)\" \n            points=\"124.913,210.751 89.063,193.264 89.103,193.245 89.093,193.24 \n            51,211.82 124.941,247.884 199,211.9 160.771,192.962 \"/>\n            <polygon id=\"right\" fill=\"url(#right_2_)\" stroke=\"url(#right_2_)\" \n            points=\"198.996,138.632 198.996,38.123 165.596,58.995 165.596,117.758 \n            165.596,117.758 165.596,117.758 51.091,174.781 51.091,211.945 \"/>\n            <polygon id=\"left\" fill=\"url(#left_1_)\" stroke=\"url(#left_1_)\" \n            points=\"199,211.912 199,211.912 199,174.746 84.498,117.723 84.498,58.96 \n            51.096,38.088 51.096,138.597 \"/>\n            <polygon id=\"top\" fill=\"url(#top_1_)\" stroke=\"url(#top_1_)\" \n            points=\"84.396,58.904 84.396,58.892 124.939,39.118 165.485,58.892 \n            198.844,38.046 124.912,1.985 51,38.035 51,38.067 84.368,58.918 \"/>\n        </svg>\n\n\n    </body>\n</html>"
  },
  {
    "path": "demos/snap-mascot/style.css",
    "content": "html {\n    overflow: hidden;\n}\n\nbody {\n    background: #eee;\n    text-align: center;\n}\n\nsvg {\n    display: inline-block;\n}\n\niframe {\n    display: inline-block;\n    border: none;\n    height: 300px;\n    width: 400px;\n    margin: 10px;\n}"
  },
  {
    "path": "demos/tutorial/1.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Tutorial</title>\n        <link rel=\"stylesheet\" href=\"../../doc/fonts/stylesheet.css\">\n        <link rel=\"stylesheet\" href=\"../../doc/css/prism.css\">\n        <style media=\"screen\">\n            pre.code {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                padding: 10px;\n                height: 280px;\n                overflow: auto;\n                background: #181818;\n                border: solid 2px #181818;\n            }\n            #codelines {\n                display: none;\n            }\n            #svg {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                border: solid 2px #ccc;\n                width: 300px;\n                height: 300px;\n                float: left;\n                margin-right: 10px;\n                font: 1em source-sans-pro, Source Sans Pro, Helvetica, sans-serif;\n            }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script src=\"../../doc/js/prism.js\"></script>\n        <script>\n        var S;\n        window.onload = function () {\n            var s = Snap(850, 35);\n            function chooser(s, count) {\n                var loop = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60\",\n                    line = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60c30,0,60-60,90-60a30,30,0,0,1,0,60a30,30,0,0,1,0-60\",\n                    l1 = Snap.path.getTotalLength(loop),\n                    l2 = Snap.path.getTotalLength(line),\n                    cur = 1,\n                    p = s.path({\n                        path: loop,\n                        fill: \"none\",\n                        stroke: \"#f00\",\n                        strokeWidth: 6,\n                        strokeLinecap: \"round\"\n                    });\n                for (var i = 1; i <= count; i++) {\n                    s.text(90 * i - 55, 49, i).attr({\n                        font: \"45px source-sans-pro, Source Sans Pro, Helvetica, sans-serif\",\n                        textAnchor: \"middle\"\n                    });\n                    (function (i) {\n                        s.circle(90 * i - 55, 35, 40).attr({\n                            opacity: 0\n                        }).click(eve.f(\"tut.click\", i - 1));\n                    }(i));\n                }\n                s.path(\"M11.166,23.963L22.359,17.5c1.43-0.824,1.43-2.175,0-3L11.166,8.037c-1.429-0.826-2.598-0.15-2.598,1.5v12.926C8.568,24.113,9.737,24.789,11.166,23.963z\").transform(\"t\" + (90 * (count + 1) - 68) + \",18s2\");\n                var but = s.circle(90 * (count + 1) - 55, 35, 30).attr({\n                    fillOpacity: 0,\n                    stroke: \"#333\",\n                    strokeWidth: 2\n                });\n                eve.on(\"tut.click\", function (I) {\n                    p.attr({\n                        path: loop,\n                        transform: \"t\" + (90 * I) + \",0\"\n                    });\n                    cur = I + 1;\n                });\n                function frameHandler(frame) {\n                    function anim() {\n                        cur++;\n                        if (cur > count) {\n                            return;\n                        }\n                        if (typeof frame == \"function\") {\n                            frame(cur);\n                        }\n                        Snap.animate(0, l2 - l1, function (val) {\n                            p.attr({\n                                path: Snap.path.getSubpath(line, val, val + l1)\n                            });\n                        }, 500, function () {\n                            p.attr({\n                                path: loop,\n                                transform: p.transform() + \"t90,0\"\n                            });\n                        });\n                    }\n                    if (typeof frame == \"function\") {\n                        but.click(anim);\n                    } else {\n                        anim();\n                    }\n                }\n                return frameHandler;\n            }\n            var g = s.g();\n            g.attr({\n                transform: \"s.5,.5,0,0\"\n            });\n            var str = \"\",\n                code = document.getElementById(\"code\");\n            var domcodelines = document.querySelectorAll(\"#codelines li\"),\n                codelines = [],\n                replacers = {},\n                lines = [],\n                callback = function (i) {\n                    lines = [];\n                    for (var j = 1; j <= i; j++) {\n                        replacers[j - 1] && lines.pop();\n                        lines.push(codelines[j - 1]);\n                    }\n                    Snap(\"#svg\").clear();\n                    str = lines.join(\"\\n\");\n                    eval(str);\n                    code.innerHTML = Prism.highlight(str, Prism.languages.javascript);\n                    code.parentNode.scrollTop = code.parentNode.scrollTopMax || 1e9;\n                };\n            for (var i = 0, ii = domcodelines.length; i < ii; i++) {\n                codelines[i] = domcodelines[i].innerHTML;\n                if (domcodelines[i].className == \"replace\") {\n                    replacers[i] = true;\n                }\n            }\n            callback(1);\n            chooser(g, codelines.length)(callback);\n            eve.on(\"tut.click\", function (I) {\n                callback(I + 1);\n            });\n        };\n        </script>\n    </head>\n    <body>\n        <ol id=\"codelines\">\n<li>// Simple dashed pattern on circle\nvar s = Snap(\"#svg\");</li>\n<li>// This will be our shape. It could be anything.\nvar bigCircle = s.circle(150, 150, 100);</li>\n<li>bigCircle.attr({\n    stroke: \"#000\",\n    strokeWidth: 5\n});</li>\n<li>// Now let's create pattern\nvar p = s.path(\"M110,95,95,110M115,100,100,115\").attr({\n        fill: \"none\",\n        stroke: \"#bada55\",\n        strokeWidth: 4\n    });\n</li>\n<li>//This is where our pattern cut will happen:\nvar cut = s.rect(100, 100, 10, 10).attr({fill: \"#fff\", opacity: .5})</li>\n<li>cut.remove();</li>\n<li>//make it a pattern\nvar ptrn = p.pattern(100, 100, 10, 10);\n//ptrn is an invisible &lt;pattern> element.</li>\n<li>// Then use it as a fill on the big circle\nbigCircle.attr({\n    fill: ptrn\n});</li>\n<li>//We still have access to original path for the pattern, lets animate it a bit:</li>\n<li>p.animate({strokeWidth: 1, stroke: \"#FF4136\"}, 1e3);\n//Note that pattern could have as many elements as you want</li>\n        </ol>\n        <svg id=\"svg\"></svg>\n        <pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\" id=\"code\"></code></pre>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n    </body>\n</html>"
  },
  {
    "path": "demos/tutorial/2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Tutorial</title>\n        <link rel=\"stylesheet\" href=\"../../doc/fonts/stylesheet.css\">\n        <link rel=\"stylesheet\" href=\"../../doc/css/prism.css\">\n        <style media=\"screen\">\n            pre.code {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                padding: 10px;\n                height: 280px;\n                overflow: auto;\n                background: #181818;\n                border: solid 2px #181818;\n            }\n            #codelines {\n                display: none;\n            }\n            #svg {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                border: solid 2px #ccc;\n                width: 300px;\n                height: 300px;\n                float: left;\n                margin-right: 10px;\n                font: 1em source-sans-pro, Source Sans Pro, Helvetica, sans-serif;\n            }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script src=\"../../doc/js/prism.js\"></script>\n        <script>\n        var S;\n        window.onload = function () {\n            var s = Snap(850, 35);\n            function chooser(s, count) {\n                var loop = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60\",\n                    line = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60c30,0,60-60,90-60a30,30,0,0,1,0,60a30,30,0,0,1,0-60\",\n                    l1 = Snap.path.getTotalLength(loop),\n                    l2 = Snap.path.getTotalLength(line),\n                    cur = 1,\n                    p = s.path({\n                        path: loop,\n                        fill: \"none\",\n                        stroke: \"#f00\",\n                        strokeWidth: 6,\n                        strokeLinecap: \"round\"\n                    });\n                for (var i = 1; i <= count; i++) {\n                    s.text(90 * i - 55, 49, i).attr({\n                        font: \"45px source-sans-pro, Source Sans Pro, Helvetica, sans-serif\",\n                        textAnchor: \"middle\"\n                    });\n                    (function (i) {\n                        s.circle(90 * i - 55, 35, 40).attr({\n                            opacity: 0\n                        }).click(eve.f(\"tut.click\", i - 1));\n                    }(i));\n                }\n                s.path(\"M11.166,23.963L22.359,17.5c1.43-0.824,1.43-2.175,0-3L11.166,8.037c-1.429-0.826-2.598-0.15-2.598,1.5v12.926C8.568,24.113,9.737,24.789,11.166,23.963z\").transform(\"t\" + (90 * (count + 1) - 68) + \",18s2\");\n                var but = s.circle(90 * (count + 1) - 55, 35, 30).attr({\n                    fillOpacity: 0,\n                    stroke: \"#333\",\n                    strokeWidth: 2\n                });\n                eve.on(\"tut.click\", function (I) {\n                    p.attr({\n                        path: loop,\n                        transform: \"t\" + (90 * I) + \",0\"\n                    });\n                    cur = I + 1;\n                });\n                function frameHandler(frame) {\n                    function anim() {\n                        cur++;\n                        if (cur > count) {\n                            return;\n                        }\n                        if (typeof frame == \"function\") {\n                            frame(cur);\n                        }\n                        Snap.animate(0, l2 - l1, function (val) {\n                            p.attr({\n                                path: Snap.path.getSubpath(line, val, val + l1)\n                            });\n                        }, 500, function () {\n                            p.attr({\n                                path: loop,\n                                transform: p.transform() + \"t90,0\"\n                            });\n                        });\n                    }\n                    if (typeof frame == \"function\") {\n                        but.click(anim);\n                    } else {\n                        anim();\n                    }\n                }\n                return frameHandler;\n            }\n            var g = s.g();\n            g.attr({\n                transform: \"s.5,.5,0,0\"\n            });\n            var str = \"\",\n                code = document.getElementById(\"code\");\n            var domcodelines = document.querySelectorAll(\"#codelines li\"),\n                codelines = [],\n                replacers = {},\n                lines = [],\n                callback = function (i) {\n                    lines = [];\n                    for (var j = 1; j <= i; j++) {\n                        replacers[j - 1] && lines.pop();\n                        lines.push(codelines[j - 1]);\n                    }\n                    Snap(\"#svg\").clear();\n                    str = lines.join(\"\\n\");\n                    eval(str);\n                    code.innerHTML = Prism.highlight(str, Prism.languages.javascript);\n                    code.parentNode.scrollTop = code.parentNode.scrollTopMax || 1e9;\n                };\n            for (var i = 0, ii = domcodelines.length; i < ii; i++) {\n                codelines[i] = domcodelines[i].innerHTML;\n                if (domcodelines[i].className == \"replace\") {\n                    replacers[i] = true;\n                }\n            }\n            callback(1);\n            chooser(g, codelines.length)(callback);\n            eve.on(\"tut.click\", function (I) {\n                callback(I + 1);\n            });\n        };\n        </script>\n    </head>\n    <body>\n        <ol id=\"codelines\">\n<li>// Simple dashed pattern on circle with mask\nvar s = Snap(\"#svg\");\nvar bigCircle = s.circle(150, 150, 100).attr({\n    fill: \"#bada55\",\n    stroke: \"#000\",\n    strokeWidth: 6\n});\nvar p = s.path(\"M110,95,95,110M115,100,100,115\").attr({\n        fill: \"none\",\n        stroke: \"#bada55\",\n        strokeWidth: 4\n    });\nvar ptrn = p.pattern(100, 100, 10, 10);\nbigCircle.attr({\n    fill: ptrn\n});\n//Here is our circle from the first Snap-bit.\n</li>\n<li>//Lets create a masking circle</li>\n<li>var ring = s.circle(150, 150, 92).attr({\n    fill: \"none\",\n    stroke: \"#fff\",\n    strokeWidth: 10\n});</li>\n<li>//This looks correct, but only because our background is white</li>\n<li>s.rect(0, 150, 300, 30).attr({fill: \"#85144B\"}).insertBefore(bigCircle);\n//Uh-oh, lets try to apply this ring as a mask:</li>\n<li>bigCircle.attr({\n    mask: ring\n});</li>\n<li>//Not exactly what we want. We need to invert the mask</li>\n<li>var mask = s.mask();</li>\n<li>// Background rect:\nmask.add(s.rect(0, 0, \"100%\", \"100%\").attr({fill: \"#fff\"}));</li>\n<li>// and our ring, but black\nmask.add(ring.attr({stroke: \"#000\"}));</li>\n<li>bigCircle.attr({\n    mask: mask\n});</li>\n<li>//Now, let’s animate the ring:</li>\n<li>ring.animate({r: 10}, 1e3);</li>\n\n        </ol>\n        <svg id=\"svg\"></svg>\n        <pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\" id=\"code\"></code></pre>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n    </body>\n</html>"
  },
  {
    "path": "demos/tutorial/3.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Tutorial</title>\n        <link rel=\"stylesheet\" href=\"../../doc/fonts/stylesheet.css\">\n        <link rel=\"stylesheet\" href=\"../../doc/css/prism.css\">\n        <style media=\"screen\">\n            pre.code {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                padding: 10px;\n                height: 280px;\n                overflow: auto;\n                background: #181818;\n                border: solid 2px #181818;\n            }\n            #codelines {\n                display: none;\n            }\n            #svg {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                border: solid 2px #ccc;\n                width: 300px;\n                height: 300px;\n                float: left;\n                margin-right: 10px;\n                font: 1em source-sans-pro, Source Sans Pro, Helvetica, sans-serif;\n            }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script src=\"../../doc/js/prism.js\"></script>\n        <script>\n        var S;\n        window.onload = function () {\n            var s = Snap(850, 35);\n            function chooser(s, count) {\n                var loop = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60\",\n                    line = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60c30,0,60-60,90-60a30,30,0,0,1,0,60a30,30,0,0,1,0-60\",\n                    l1 = Snap.path.getTotalLength(loop),\n                    l2 = Snap.path.getTotalLength(line),\n                    cur = 1,\n                    p = s.path({\n                        path: loop,\n                        fill: \"none\",\n                        stroke: \"#f00\",\n                        strokeWidth: 6,\n                        strokeLinecap: \"round\"\n                    });\n                for (var i = 1; i <= count; i++) {\n                    s.text(90 * i - 55, 49, i).attr({\n                        font: \"45px source-sans-pro, Source Sans Pro, Helvetica, sans-serif\",\n                        textAnchor: \"middle\"\n                    });\n                    (function (i) {\n                        s.circle(90 * i - 55, 35, 40).attr({\n                            opacity: 0\n                        }).click(eve.f(\"tut.click\", i - 1));\n                    }(i));\n                }\n                s.path(\"M11.166,23.963L22.359,17.5c1.43-0.824,1.43-2.175,0-3L11.166,8.037c-1.429-0.826-2.598-0.15-2.598,1.5v12.926C8.568,24.113,9.737,24.789,11.166,23.963z\").transform(\"t\" + (90 * (count + 1) - 68) + \",18s2\");\n                var but = s.circle(90 * (count + 1) - 55, 35, 30).attr({\n                    fillOpacity: 0,\n                    stroke: \"#333\",\n                    strokeWidth: 2\n                });\n                eve.on(\"tut.click\", function (I) {\n                    p.attr({\n                        path: loop,\n                        transform: \"t\" + (90 * I) + \",0\"\n                    });\n                    cur = I + 1;\n                });\n                function frameHandler(frame) {\n                    function anim() {\n                        cur++;\n                        if (cur > count) {\n                            return;\n                        }\n                        if (typeof frame == \"function\") {\n                            frame(cur);\n                        }\n                        Snap.animate(0, l2 - l1, function (val) {\n                            p.attr({\n                                path: Snap.path.getSubpath(line, val, val + l1)\n                            });\n                        }, 500, function () {\n                            p.attr({\n                                path: loop,\n                                transform: p.transform() + \"t90,0\"\n                            });\n                        });\n                    }\n                    if (typeof frame == \"function\") {\n                        but.click(anim);\n                    } else {\n                        anim();\n                    }\n                }\n                return frameHandler;\n            }\n            var g = s.g();\n            g.attr({\n                transform: \"s.5,.5,0,0\"\n            });\n            var str = \"\",\n                code = document.getElementById(\"code\");\n            var domcodelines = document.querySelectorAll(\"#codelines li\"),\n                codelines = [],\n                replacers = {},\n                lines = [],\n                callback = function (i) {\n                    lines = [];\n                    for (var j = 1; j <= i; j++) {\n                        replacers[j - 1] && lines.pop();\n                        lines.push(codelines[j - 1]);\n                    }\n                    Snap(\"#svg\").clear();\n                    str = lines.join(\"\\n\");\n                    eval(str);\n                    code.innerHTML = Prism.highlight(str, Prism.languages.javascript);\n                    code.parentNode.scrollTop = code.parentNode.scrollTopMax || 1e9;\n                };\n            for (var i = 0, ii = domcodelines.length; i < ii; i++) {\n                codelines[i] = domcodelines[i].innerHTML;\n                if (domcodelines[i].className == \"replace\") {\n                    replacers[i] = true;\n                }\n            }\n            callback(1);\n            chooser(g, codelines.length)(callback);\n            eve.on(\"tut.click\", function (I) {\n                callback(I + 1);\n            });\n        };\n        </script>\n    </head>\n    <body>\n        <ol id=\"codelines\">\n<li>// Simple dashed pattern on circle with mask\n// Lets connect mask and circle together. Also useful if we have a path\n// and can’t calculate offset easily.\nvar s = Snap(\"#svg\");\n// So, lets start with an empty circle.\n// It’s important that it will not have any attributes set\nvar bigCircle = s.circle(150, 150, 100);</li>\n<li>//-----------------------------------------------------\n// Lets use it again for patterned fill\nvar c1 = bigCircle.use();\n// Create pattern\nvar p = s.path(\"M110,95,95,110M115,100,100,115\").attr({\n        fill: \"none\",\n        stroke: \"#bada55\",\n        strokeWidth: 4\n    });\nvar ptrn = p.pattern(100, 100, 10, 10);\n// and apply some nice attributes\nc1.attr({\n    fill: ptrn\n});</li>\n<li>//-----------------------------------------------------\n// Lets use it for stroke\nvar c2 = bigCircle.use();\nc2.attr({\n    fill: \"none\",\n    stroke: \"#000\",\n    strokeWidth: 6\n});</li>\n<li>// Lets create a masking circle</li>\n<li>var ring = bigCircle.use();\nring.attr({\n    fill: \"none\",\n    stroke: \"#000\",\n    strokeWidth: 20 // we need only inner 10px of it\n});</li>\n<li>// Hide bigCircle by moving it to &lt;defs>\nbigCircle.toDefs();</li>\n<li>var mask = s.mask();</li>\n<li>// Background rect:\nmask.add(s.rect(0, 0, \"100%\", \"100%\").attr({fill: \"#fff\"}));</li>\n<li>// and our ring\nmask.add(ring);</li>\n<li>c1.attr({\n    mask: mask\n});</li>\n<li>//Now, let’s animate bigCircle:</li>\n<li>bigCircle.animate({r: 50}, 5e3, mina.elastic);\n// Despite bigCircle is not visible it affect all 3 “uses” of it.</li>\n\n        </ol>\n        <svg id=\"svg\"></svg>\n        <pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\" id=\"code\"></code></pre>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n    </body>\n</html>"
  },
  {
    "path": "demos/tutorial/4.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Tutorial</title>\n        <link rel=\"stylesheet\" href=\"../../doc/fonts/stylesheet.css\">\n        <link rel=\"stylesheet\" href=\"../../doc/css/prism.css\">\n        <style media=\"screen\">\n            pre.code {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                padding: 10px;\n                height: 280px;\n                overflow: auto;\n                background: #181818;\n                border: solid 2px #181818;\n            }\n            #codelines {\n                display: none;\n            }\n            #svg {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                border: solid 2px #ccc;\n                width: 300px;\n                height: 300px;\n                float: left;\n                margin-right: 10px;\n                font: 1em source-sans-pro, Source Sans Pro, Helvetica, sans-serif;\n            }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script src=\"../../doc/js/prism.js\"></script>\n        <script>\n        var S;\n        window.onload = function () {\n            var s = Snap(850, 35);\n            function chooser(s, count) {\n                var loop = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60\",\n                    line = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60c30,0,60-60,90-60a30,30,0,0,1,0,60a30,30,0,0,1,0-60\",\n                    l1 = Snap.path.getTotalLength(loop),\n                    l2 = Snap.path.getTotalLength(line),\n                    cur = 1,\n                    p = s.path({\n                        path: loop,\n                        fill: \"none\",\n                        stroke: \"#f00\",\n                        strokeWidth: 6,\n                        strokeLinecap: \"round\"\n                    });\n                for (var i = 1; i <= count; i++) {\n                    s.text(90 * i - 55, 49, i).attr({\n                        font: \"45px source-sans-pro, Source Sans Pro, Helvetica, sans-serif\",\n                        textAnchor: \"middle\"\n                    });\n                    (function (i) {\n                        s.circle(90 * i - 55, 35, 40).attr({\n                            opacity: 0\n                        }).click(eve.f(\"tut.click\", i - 1));\n                    }(i));\n                }\n                s.path(\"M11.166,23.963L22.359,17.5c1.43-0.824,1.43-2.175,0-3L11.166,8.037c-1.429-0.826-2.598-0.15-2.598,1.5v12.926C8.568,24.113,9.737,24.789,11.166,23.963z\").transform(\"t\" + (90 * (count + 1) - 68) + \",18s2\");\n                var but = s.circle(90 * (count + 1) - 55, 35, 30).attr({\n                    fillOpacity: 0,\n                    stroke: \"#333\",\n                    strokeWidth: 2\n                });\n                eve.on(\"tut.click\", function (I) {\n                    p.attr({\n                        path: loop,\n                        transform: \"t\" + (90 * I) + \",0\"\n                    });\n                    cur = I + 1;\n                });\n                function frameHandler(frame) {\n                    function anim() {\n                        cur++;\n                        if (cur > count) {\n                            return;\n                        }\n                        if (typeof frame == \"function\") {\n                            frame(cur);\n                        }\n                        Snap.animate(0, l2 - l1, function (val) {\n                            p.attr({\n                                path: Snap.path.getSubpath(line, val, val + l1)\n                            });\n                        }, 500, function () {\n                            p.attr({\n                                path: loop,\n                                transform: p.transform() + \"t90,0\"\n                            });\n                        });\n                    }\n                    if (typeof frame == \"function\") {\n                        but.click(anim);\n                    } else {\n                        anim();\n                    }\n                }\n                return frameHandler;\n            }\n            var g = s.g();\n            g.attr({\n                transform: \"s.5,.5,0,0\"\n            });\n            var str = \"\",\n                code = document.getElementById(\"code\");\n            var domcodelines = document.querySelectorAll(\"#codelines li\"),\n                codelines = [],\n                replacers = {},\n                lines = [],\n                callback = function (i) {\n                    lines = [];\n                    for (var j = 1; j <= i; j++) {\n                        replacers[j - 1] && lines.pop();\n                        lines.push(codelines[j - 1]);\n                    }\n                    Snap(\"#svg\").clear();\n                    str = lines.join(\"\\n\");\n                    eval(str);\n                    code.innerHTML = Prism.highlight(str, Prism.languages.javascript);\n                    code.parentNode.scrollTop = code.parentNode.scrollTopMax || 1e9;\n                };\n            for (var i = 0, ii = domcodelines.length; i < ii; i++) {\n                codelines[i] = domcodelines[i].innerHTML;\n                if (domcodelines[i].className == \"replace\") {\n                    replacers[i] = true;\n                }\n            }\n            callback(1);\n            chooser(g, codelines.length)(callback);\n            eve.on(\"tut.click\", function (I) {\n                callback(I + 1);\n            });\n        };\n        </script>\n    </head>\n    <body>\n        <ol id=\"codelines\">\n<li>// Text on the path\nvar s = Snap(\"#svg\");</li>\n<li>// Setting the background\nvar bg = s.rect(50, 50, 200, 200, 10).attr({fill: \"#ccc\"});</li>\n<li>var t = s.text(150, 150, \"Test Text\").attr({\n    font: \"30px Helvetica, sans-serif\",\n    textAnchor: \"middle\",\n    fill: \"#ddd\"\n});</li>\n<li>// Lets create a mask</li>\n<li>var t2 = t.use().attr({\n    stroke: \"#000\",\n    strokeWidth: 10,\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n});\n</li>\n<li>var mask = s.mask();</li>\n<li>// Background rect:\nmask.add(s.rect(0, 0, \"100%\", \"100%\").attr({fill: \"#fff\"}));</li>\n<li>// and our ring\nmask.add(t2);</li>\n<li>bg.attr({\n    mask: mask\n});</li>\n<li>//Now, let’s animate:</li>\n<li>t2.animate({strokeWidth: 4}, 5e3, mina.bounce);</li>\n\n        </ol>\n        <svg id=\"svg\"></svg>\n        <pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\" id=\"code\"></code></pre>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n    </body>\n</html>"
  },
  {
    "path": "demos/tutorial/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Tutorial</title>\n        <link rel=\"stylesheet\" href=\"../../doc/fonts/stylesheet.css\">\n        <link rel=\"stylesheet\" href=\"../../doc/css/prism.css\">\n        <style media=\"screen\">\n            pre.code {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                padding: 10px;\n                height: 280px;\n                overflow: auto;\n                background: #181818;\n                border: solid 2px #181818;\n            }\n            #codelines {\n                display: none;\n            }\n            #svg {\n                -moz-border-radius: 10px;\n                -webkit-border-radius: 10px;\n                border-radius: 10px;\n                border: solid 2px #ccc;\n                width: 300px;\n                height: 300px;\n                float: left;\n                margin-right: 10px;\n                font: 1em source-sans-pro, Source Sans Pro, Helvetica, sans-serif;\n            }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n        <script src=\"../../doc/js/prism.js\"></script>\n        <script>\n        var S;\n        window.onload = function () {\n            var s = Snap(850, 35);\n            function chooser(s, count) {\n                var loop = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60\",\n                    line = \"M35,65a30,30,0,0,0,0-60a30,30,0,0,0,0,60c30,0,60-60,90-60a30,30,0,0,1,0,60a30,30,0,0,1,0-60\",\n                    l1 = Snap.path.getTotalLength(loop),\n                    l2 = Snap.path.getTotalLength(line),\n                    cur = 1,\n                    p = s.path({\n                        path: loop,\n                        fill: \"none\",\n                        stroke: \"#f00\",\n                        strokeWidth: 6,\n                        strokeLinecap: \"round\"\n                    });\n                for (var i = 1; i <= count; i++) {\n                    s.text(90 * i - 55, 49, i).attr({\n                        font: \"45px source-sans-pro, Source Sans Pro, Helvetica, sans-serif\",\n                        textAnchor: \"middle\"\n                    });\n                    (function (i) {\n                        s.circle(90 * i - 55, 35, 40).attr({\n                            opacity: 0\n                        }).click(eve.f(\"tut.click\", i - 1));\n                    }(i));\n                }\n                s.path(\"M11.166,23.963L22.359,17.5c1.43-0.824,1.43-2.175,0-3L11.166,8.037c-1.429-0.826-2.598-0.15-2.598,1.5v12.926C8.568,24.113,9.737,24.789,11.166,23.963z\").transform(\"t\" + (90 * (count + 1) - 68) + \",18s2\");\n                var but = s.circle(90 * (count + 1) - 55, 35, 30).attr({\n                    fillOpacity: 0,\n                    stroke: \"#333\",\n                    strokeWidth: 2\n                });\n                eve.on(\"tut.click\", function (I) {\n                    p.attr({\n                        path: loop,\n                        transform: \"t\" + (90 * I) + \",0\"\n                    });\n                    cur = I + 1;\n                });\n                function frameHandler(frame) {\n                    function anim() {\n                        cur++;\n                        if (cur > count) {\n                            return;\n                        }\n                        if (typeof frame == \"function\") {\n                            frame(cur);\n                        }\n                        Snap.animate(0, l2 - l1, function (val) {\n                            p.attr({\n                                path: Snap.path.getSubpath(line, val, val + l1)\n                            });\n                        }, 500, function () {\n                            p.attr({\n                                path: loop,\n                                transform: p.transform() + \"t90,0\"\n                            });\n                        });\n                    }\n                    if (typeof frame == \"function\") {\n                        but.click(anim);\n                    } else {\n                        anim();\n                    }\n                }\n                return frameHandler;\n            }\n            var g = s.g();\n            g.attr({\n                transform: \"s.5,.5,0,0\"\n            });\n            var str = \"\",\n                code = document.getElementById(\"code\");\n            var domcodelines = document.querySelectorAll(\"#codelines li\"),\n                codelines = [],\n                replacers = {},\n                lines = [],\n                callback = function (i) {\n                    lines = [];\n                    for (var j = 1; j <= i; j++) {\n                        replacers[j - 1] && lines.pop();\n                        lines.push(codelines[j - 1]);\n                    }\n                    Snap(\"#svg\").clear();\n                    str = lines.join(\"\\n\");\n                    eval(str);\n                    code.innerHTML = Prism.highlight(str, Prism.languages.javascript);\n                    code.parentNode.scrollTop = code.parentNode.scrollTopMax || 1e9;\n                };\n            for (var i = 0, ii = domcodelines.length; i < ii; i++) {\n                codelines[i] = domcodelines[i].innerHTML;\n                if (domcodelines[i].className == \"replace\") {\n                    replacers[i] = true;\n                }\n            }\n            callback(1);\n            chooser(g, codelines.length)(callback);\n            eve.on(\"tut.click\", function (I) {\n                callback(I + 1);\n            });\n        };\n        </script>\n    </head>\n    <body>\n        <ol id=\"codelines\">\n<li>// First, let's create our drawing surface out of an existing SVG element\n// If you want to create a new surface just provide dimensions\n// like s = Snap(800, 600);\nvar s = Snap(\"#svg\");</li>\n<li>// Let's create a big circle in the middle:\nvar bigCircle = s.circle(150, 150, 100);\n// By default it is black, let's change its attributes</li>\n<li>bigCircle.attr({\n    fill: \"#bada55\",\n    stroke: \"#000\",\n    strokeWidth: 5\n});</li>\n<li>// Now let's create another small circle:\nvar smallCircle = s.circle(100, 150, 70);</li>\n<li>// Let's put this small circle and another one into a group:\nvar discs = s.group(smallCircle, s.circle(200, 150, 70));</li>\n<li>// Now we can change attributes for the whole group\ndiscs.attr({\n    fill: \"#fff\"\n});</li>\n<li>// Now more interesting stuff\n// Let's assign this group as a mask for our big circle\nbigCircle.attr({\n    mask: discs\n});</li>\n<li>// Despite our small circle being part of a group\n// and part of a mask we can still access it:\nsmallCircle.animate({r: 50}, 1000);</li>\n<li>// We don’t have a reference for second small circle,\n// but we can easily grab it with CSS selectors:\ndiscs.select(\"circle:nth-child(2)\").animate({r: 50}, 1000);</li>\n<li>// Now let's create pattern\nvar p = s.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n        fill: \"none\",\n        stroke: \"#bada55\",\n        strokeWidth: 5\n    });\n// To create a pattern,\n// just specify dimensions in the pattern method:\np = p.pattern(0, 0, 10, 10);\n// Then use it as a fill on the big circle\nbigCircle.attr({\n    fill: p\n});</li>\n<li>// We can also grab a pattern from an SVG\n// already embedded into our page\ndiscs.attr({\n    fill: Snap(\"#pattern\")\n});</li>\n<li>// Let's change the fill of the circles to gradient\n// This string means relative radial gradient\n// from white to black\ndiscs.attr({fill: \"r()#fff-#000\"});\n// Note that we have two gradients, one for each circle</li>\n<li>// If we want them to share one gradient,\n// we need to use an absolute gradient with capital R\ndiscs.attr({fill: \"R(150, 150, 100)#fff-#000\"});</li>\n<li>// Of course we can animate color as well\np.select(\"path\").animate({stroke: \"#f00\"}, 1000);</li>\n<li>// Now let's load an external SVG file:\nSnap.load(\"mascot.svg\", function (f) {\n    // Note that we traverse and change attr before the SVG\n    // is even added to the page\n    f.select(\"polygon[fill='#09B39C']\").attr({fill: \"#bada55\"});\n    g = f.select(\"g\");\n    s.append(g);\n    // Making croc draggable. Go ahead drag it around!\n    g.drag();\n    // Obviously drag could take event handlers too\n    // Looks like our croc is made from more than one polygon...\n});</li>\n<li class=\"replace\">// Now let's load an external SVG file:\nSnap.load(\"mascot.svg\", function (f) {\n    // Note that we traverse and change attr before SVG\n    // is even added to the page\n    f.selectAll(\"polygon[fill='#09B39C']\").attr({fill: \"#bada55\"});\n    g = f.select(\"g\");\n    s.append(g);\n    // Making croc draggable. Go ahead drag it around!\n    g.drag();\n    // Obviously drag could take event handlers too\n    // That’s better! selectAll for the rescue.\n});</li>\n<li>// Writing text is as simple as:\ns.text(200, 100, \"Snap.svg\");</li>\n<li>// Provide an array of strings (or arrays), to generate tspans\nvar t = s.text(200, 120, [\"Snap\", \".\", \"svg\"]);\nt.selectAll(\"tspan:nth-child(3)\").attr({\n    fill: \"#900\",\n    \"font-size\": \"20px\"\n});</li>\n        </ol>\n        <svg id=\"svg\"></svg>\n        <pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\" id=\"code\"></code></pre>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n    </body>\n</html>"
  },
  {
    "path": "demos/tutorial/tutorial.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title>Snap.svg</title>\n        <style>\n        body {\n            background: #333;\n        }\n        </style>\n        <script src=\"../../dist/snap.svg-min.js\"></script>\n    </head>\n    <body>\n        <svg width=\"0\" height=\"0\">\n            <pattern id=\"pattern\" patternUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">\n                <path d=\"M-5,0,10,15M0-5,15,10\" stroke=\"white\" stroke-width=\"5\"/>\n            </pattern>\n        </svg>\n        <script>\n            var s = Snap();\n            var bigCircle = s.circle(100, 100, 50);\n            bigCircle.attr({\n                fill: \"#bada55\",\n                stroke: \"#000\",\n                strokeWidth: 5\n            });\n            var smallCircle = s.circle(70, 100, 40);\n            var discs = s.group(smallCircle, s.circle(130, 100, 40));\n            discs.attr({\n                fill: Snap(\"#pattern\")\n            });\n            bigCircle.attr({\n                mask: discs\n            });\n            Snap.load(\"mascot.svg\", function (f) {\n                var g = f.select(\"g\");\n                f.selectAll(\"polygon[fill='#09B39C']\").attr({\n                    fill: \"#fc0\"\n                })\n                s.append(g);\n                g.drag();\n            });\n        </script>\n    </body>\n</html>"
  },
  {
    "path": "dist/snap.svg-min.js",
    "content": "// Snap.svg 0.5.1\n//\n// Copyright (c) 2013 – 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// build: 2017-02-07\n\n!function(a){var b,c,d=\"0.5.0\",e=\"hasOwnProperty\",f=/[\\.\\/]/,g=/\\s*,\\s*/,h=\"*\",i=function(a,b){return a-b},j={n:{}},k=function(){for(var a=0,b=this.length;b>a;a++)if(\"undefined\"!=typeof this[a])return this[a]},l=function(){for(var a=this.length;--a;)if(\"undefined\"!=typeof this[a])return this[a]},m=Object.prototype.toString,n=String,o=Array.isArray||function(a){return a instanceof Array||\"[object Array]\"==m.call(a)};eve=function(a,d){var e,f=c,g=Array.prototype.slice.call(arguments,2),h=eve.listeners(a),j=0,m=[],n={},o=[],p=b;o.firstDefined=k,o.lastDefined=l,b=a,c=0;for(var q=0,r=h.length;r>q;q++)\"zIndex\"in h[q]&&(m.push(h[q].zIndex),h[q].zIndex<0&&(n[h[q].zIndex]=h[q]));for(m.sort(i);m[j]<0;)if(e=n[m[j++]],o.push(e.apply(d,g)),c)return c=f,o;for(q=0;r>q;q++)if(e=h[q],\"zIndex\"in e)if(e.zIndex==m[j]){if(o.push(e.apply(d,g)),c)break;do if(j++,e=n[m[j]],e&&o.push(e.apply(d,g)),c)break;while(e)}else n[e.zIndex]=e;else if(o.push(e.apply(d,g)),c)break;return c=f,b=p,o},eve._events=j,eve.listeners=function(a){var b,c,d,e,g,i,k,l,m=o(a)?a:a.split(f),n=j,p=[n],q=[];for(e=0,g=m.length;g>e;e++){for(l=[],i=0,k=p.length;k>i;i++)for(n=p[i].n,c=[n[m[e]],n[h]],d=2;d--;)b=c[d],b&&(l.push(b),q=q.concat(b.f||[]));p=l}return q},eve.separator=function(a){a?(a=n(a).replace(/(?=[\\.\\^\\]\\[\\-])/g,\"\\\\\"),a=\"[\"+a+\"]\",f=new RegExp(a)):f=/[\\.\\/]/},eve.on=function(a,b){if(\"function\"!=typeof b)return function(){};for(var c=o(a)?o(a[0])?a:[a]:n(a).split(g),d=0,e=c.length;e>d;d++)!function(a){for(var c,d=o(a)?a:n(a).split(f),e=j,g=0,h=d.length;h>g;g++)e=e.n,e=e.hasOwnProperty(d[g])&&e[d[g]]||(e[d[g]]={n:{}});for(e.f=e.f||[],g=0,h=e.f.length;h>g;g++)if(e.f[g]==b){c=!0;break}!c&&e.f.push(b)}(c[d]);return function(a){+a==+a&&(b.zIndex=+a)}},eve.f=function(a){var b=[].slice.call(arguments,1);return function(){eve.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},eve.stop=function(){c=1},eve.nt=function(a){var c=o(b)?b.join(\".\"):b;return a?new RegExp(\"(?:\\\\.|\\\\/|^)\"+a+\"(?:\\\\.|\\\\/|$)\").test(c):c},eve.nts=function(){return o(b)?b:b.split(f)},eve.off=eve.unbind=function(a,b){if(!a)return void(eve._events=j={n:{}});var c=o(a)?o(a[0])?a:[a]:n(a).split(g);if(c.length>1)for(var d=0,i=c.length;i>d;d++)eve.off(c[d],b);else{c=o(a)?a:n(a).split(f);var k,l,m,d,i,p,q,r=[j],s=[];for(d=0,i=c.length;i>d;d++)for(p=0;p<r.length;p+=m.length-2){if(m=[p,1],k=r[p].n,c[d]!=h)k[c[d]]&&(m.push(k[c[d]]),s.unshift({n:k,name:c[d]}));else for(l in k)k[e](l)&&(m.push(k[l]),s.unshift({n:k,name:l}));r.splice.apply(r,m)}for(d=0,i=r.length;i>d;d++)for(k=r[d];k.n;){if(b){if(k.f){for(p=0,q=k.f.length;q>p;p++)if(k.f[p]==b){k.f.splice(p,1);break}!k.f.length&&delete k.f}for(l in k.n)if(k.n[e](l)&&k.n[l].f){var t=k.n[l].f;for(p=0,q=t.length;q>p;p++)if(t[p]==b){t.splice(p,1);break}!t.length&&delete k.n[l].f}}else{delete k.f;for(l in k.n)k.n[e](l)&&k.n[l].f&&delete k.n[l].f}k=k.n}a:for(d=0,i=s.length;i>d;d++){k=s[d];for(l in k.n[k.name].f)continue a;for(l in k.n[k.name].n)continue a;delete k.n[k.name]}}},eve.once=function(a,b){var c=function(){return eve.off(a,c),b.apply(this,arguments)};return eve.on(a,c)},eve.version=d,eve.toString=function(){return\"You are running Eve \"+d},\"undefined\"!=typeof module&&module.exports?module.exports=eve:\"function\"==typeof define&&define.amd?define(\"eve\",[],function(){return eve}):a.eve=eve}(this),function(a,b){if(\"function\"==typeof define&&define.amd)define([\"eve\"],function(c){return b(a,c)});else if(\"undefined\"!=typeof exports){var c=require(\"eve\");module.exports=b(a,c)}else b(a,a.eve)}(window||this,function(a,b){var c=function(b){var c,d={},e=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){return setTimeout(a,16,(new Date).getTime()),!0},f=Array.isArray||function(a){return a instanceof Array||\"[object Array]\"==Object.prototype.toString.call(a)},g=0,h=\"M\"+(+new Date).toString(36),i=function(){return h+(g++).toString(36)},j=Date.now||function(){return+new Date},k=function(a){var b=this;if(null==a)return b.s;var c=b.s-a;b.b+=b.dur*c,b.B+=b.dur*c,b.s=a},l=function(a){var b=this;return null==a?b.spd:void(b.spd=a)},m=function(a){var b=this;return null==a?b.dur:(b.s=b.s*a/b.dur,void(b.dur=a))},n=function(){var a=this;delete d[a.id],a.update(),b(\"mina.stop.\"+a.id,a)},o=function(){var a=this;a.pdif||(delete d[a.id],a.update(),a.pdif=a.get()-a.b)},p=function(){var a=this;a.pdif&&(a.b=a.get()-a.pdif,delete a.pdif,d[a.id]=a,r())},q=function(){var a,b=this;if(f(b.start)){a=[];for(var c=0,d=b.start.length;d>c;c++)a[c]=+b.start[c]+(b.end[c]-b.start[c])*b.easing(b.s)}else a=+b.start+(b.end-b.start)*b.easing(b.s);b.set(a)},r=function(a){if(!a)return void(c||(c=e(r)));var f=0;for(var g in d)if(d.hasOwnProperty(g)){var h=d[g],i=h.get();f++,h.s=(i-h.b)/(h.dur/h.spd),h.s>=1&&(delete d[g],h.s=1,f--,function(a){setTimeout(function(){b(\"mina.finish.\"+a.id,a)})}(h)),h.update()}c=f?e(r):!1},s=function(a,b,c,e,f,g,h){var j={id:i(),start:a,end:b,b:c,s:0,dur:e-c,spd:1,get:f,set:g,easing:h||s.linear,status:k,speed:l,duration:m,stop:n,pause:o,resume:p,update:q};d[j.id]=j;var t,u=0;for(t in d)if(d.hasOwnProperty(t)&&(u++,2==u))break;return 1==u&&r(),j};return s.time=j,s.getById=function(a){return d[a]||null},s.linear=function(a){return a},s.easeout=function(a){return Math.pow(a,1.7)},s.easein=function(a){return Math.pow(a,.48)},s.easeinout=function(a){if(1==a)return 1;if(0==a)return 0;var b=.48-a/1.04,c=Math.sqrt(.1734+b*b),d=c-b,e=Math.pow(Math.abs(d),1/3)*(0>d?-1:1),f=-c-b,g=Math.pow(Math.abs(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},s.backin=function(a){if(1==a)return 1;var b=1.70158;return a*a*((b+1)*a-b)},s.backout=function(a){if(0==a)return 0;a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},s.elastic=function(a){return a==!!a?a:Math.pow(2,-10*a)*Math.sin((a-.075)*(2*Math.PI)/.3)+1},s.bounce=function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b},a.mina=s,s}(\"undefined\"==typeof b?function(){}:b),d=function(a){function c(a,b){if(a){if(a.nodeType)return w(a);if(e(a,\"array\")&&c.set)return c.set.apply(c,a);if(a instanceof s)return a;if(null==b)try{return a=y.doc.querySelector(String(a)),w(a)}catch(d){return null}}return a=null==a?\"100%\":a,b=null==b?\"100%\":b,new v(a,b)}function d(a,b){if(b){if(\"#text\"==a&&(a=y.doc.createTextNode(b.text||b[\"#text\"]||\"\")),\"#comment\"==a&&(a=y.doc.createComment(b.text||b[\"#text\"]||\"\")),\"string\"==typeof a&&(a=d(a)),\"string\"==typeof b)return 1==a.nodeType?\"xlink:\"==b.substring(0,6)?a.getAttributeNS(T,b.substring(6)):\"xml:\"==b.substring(0,4)?a.getAttributeNS(U,b.substring(4)):a.getAttribute(b):\"text\"==b?a.nodeValue:null;if(1==a.nodeType){for(var c in b)if(b[z](c)){var e=A(b[c]);e?\"xlink:\"==c.substring(0,6)?a.setAttributeNS(T,c.substring(6),e):\"xml:\"==c.substring(0,4)?a.setAttributeNS(U,c.substring(4),e):a.setAttribute(c,e):a.removeAttribute(c)}}else\"text\"in b&&(a.nodeValue=b.text)}else a=y.doc.createElementNS(U,a);return a}function e(a,b){return b=A.prototype.toLowerCase.call(b),\"finite\"==b?isFinite(a):\"array\"==b&&(a instanceof Array||Array.isArray&&Array.isArray(a))?!0:\"null\"==b&&null===a||b==typeof a&&null!==a||\"object\"==b&&a===Object(a)||J.call(a).slice(8,-1).toLowerCase()==b}function f(a){if(\"function\"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=f(a[c]));return b}function h(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function i(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join(\"␀\"),g=d.cache=d.cache||{},i=d.count=d.count||[];return g[z](f)?(h(i,f),c?c(g[f]):g[f]):(i.length>=1e3&&delete g[i.shift()],i.push(f),g[f]=a.apply(b,e),c?c(g[f]):g[f])}return d}function j(a,b,c,d,e,f){if(null==e){var g=a-c,h=b-d;return g||h?(180+180*D.atan2(-h,-g)/H+360)%360:0}return j(a,b,e,f)-j(c,d,e,f)}function k(a){return a%360*H/180}function l(a){return 180*a/H%360}function m(a){var b=[];return a=a.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g,function(a,c,d){return d=d.split(/\\s*,\\s*|\\s+/),\"rotate\"==c&&1==d.length&&d.push(0,0),\"scale\"==c&&(d.length>2?d=d.slice(0,2):2==d.length&&d.push(0,0),1==d.length&&d.push(d[0],0,0)),\"skewX\"==c?b.push([\"m\",1,0,D.tan(k(d[0])),1,0,0]):\"skewY\"==c?b.push([\"m\",1,D.tan(k(d[0])),0,1,0,0]):b.push([c.charAt(0)].concat(d)),a}),b}function n(a,b){var d=aa(a),e=new c.Matrix;if(d)for(var f=0,g=d.length;g>f;f++){var h,i,j,k,l,m=d[f],n=m.length,o=A(m[0]).toLowerCase(),p=m[0]!=o,q=p?e.invert():0;\"t\"==o&&2==n?e.translate(m[1],0):\"t\"==o&&3==n?p?(h=q.x(0,0),i=q.y(0,0),j=q.x(m[1],m[2]),k=q.y(m[1],m[2]),e.translate(j-h,k-i)):e.translate(m[1],m[2]):\"r\"==o?2==n?(l=l||b,e.rotate(m[1],l.x+l.width/2,l.y+l.height/2)):4==n&&(p?(j=q.x(m[2],m[3]),k=q.y(m[2],m[3]),e.rotate(m[1],j,k)):e.rotate(m[1],m[2],m[3])):\"s\"==o?2==n||3==n?(l=l||b,e.scale(m[1],m[n-1],l.x+l.width/2,l.y+l.height/2)):4==n?p?(j=q.x(m[2],m[3]),k=q.y(m[2],m[3]),e.scale(m[1],m[1],j,k)):e.scale(m[1],m[1],m[2],m[3]):5==n&&(p?(j=q.x(m[3],m[4]),k=q.y(m[3],m[4]),e.scale(m[1],m[2],j,k)):e.scale(m[1],m[2],m[3],m[4])):\"m\"==o&&7==n&&e.add(m[1],m[2],m[3],m[4],m[5],m[6])}return e}function o(a){var b=a.node.ownerSVGElement&&w(a.node.ownerSVGElement)||a.node.parentNode&&w(a.node.parentNode)||c.select(\"svg\")||c(0,0),d=b.select(\"defs\"),e=null==d?!1:d.node;return e||(e=u(\"defs\",b.node).node),e}function p(a){return a.node.ownerSVGElement&&w(a.node.ownerSVGElement)||c.select(\"svg\")}function q(a,b,c){function e(a){if(null==a)return I;if(a==+a)return a;d(j,{width:a});try{return j.getBBox().width}catch(b){return 0}}function f(a){if(null==a)return I;if(a==+a)return a;d(j,{height:a});try{return j.getBBox().height}catch(b){return 0}}function g(d,e){null==b?i[d]=e(a.attr(d)||0):d==b&&(i=e(null==c?a.attr(d)||0:c))}var h=p(a).node,i={},j=h.querySelector(\".svg---mgr\");switch(j||(j=d(\"rect\"),d(j,{x:-9e9,y:-9e9,width:10,height:10,\"class\":\"svg---mgr\",fill:\"none\"}),h.appendChild(j)),a.type){case\"rect\":g(\"rx\",e),g(\"ry\",f);case\"image\":g(\"width\",e),g(\"height\",f);case\"text\":g(\"x\",e),g(\"y\",f);break;case\"circle\":g(\"cx\",e),g(\"cy\",f),g(\"r\",e);break;case\"ellipse\":g(\"cx\",e),g(\"cy\",f),g(\"rx\",e),g(\"ry\",f);break;case\"line\":g(\"x1\",e),g(\"x2\",e),g(\"y1\",f),g(\"y2\",f);break;case\"marker\":g(\"refX\",e),g(\"markerWidth\",e),g(\"refY\",f),g(\"markerHeight\",f);break;case\"radialGradient\":g(\"fx\",e),g(\"fy\",f);break;case\"tspan\":g(\"dx\",e),g(\"dy\",f);break;default:g(b,e)}return h.removeChild(j),i}function r(a){e(a,\"array\")||(a=Array.prototype.slice.call(arguments,0));for(var b=0,c=0,d=this.node;this[b];)delete this[b++];for(b=0;b<a.length;b++)\"set\"==a[b].type?a[b].forEach(function(a){d.appendChild(a.node)}):d.appendChild(a[b].node);var f=d.childNodes;for(b=0;b<f.length;b++)this[c++]=w(f[b]);return this}function s(a){if(a.snap in V)return V[a.snap];var b;try{b=a.ownerSVGElement}catch(c){}this.node=a,b&&(this.paper=new v(b)),this.type=a.tagName||a.nodeName;var d=this.id=S(this);if(this.anims={},this._={transform:[]},a.snap=d,V[d]=this,\"g\"==this.type&&(this.add=r),this.type in{g:1,mask:1,pattern:1,symbol:1})for(var e in v.prototype)v.prototype[z](e)&&(this[e]=v.prototype[e])}function t(a){this.node=a}function u(a,b){var c=d(a);b.appendChild(c);var e=w(c);return e}function v(a,b){var c,e,f,g=v.prototype;if(a&&a.tagName&&\"svg\"==a.tagName.toLowerCase()){if(a.snap in V)return V[a.snap];var h=a.ownerDocument;c=new s(a),e=a.getElementsByTagName(\"desc\")[0],f=a.getElementsByTagName(\"defs\")[0],e||(e=d(\"desc\"),e.appendChild(h.createTextNode(\"Created with Snap\")),c.node.appendChild(e)),f||(f=d(\"defs\"),c.node.appendChild(f)),c.defs=f;for(var i in g)g[z](i)&&(c[i]=g[i]);c.paper=c.root=c}else c=u(\"svg\",y.doc.body),d(c.node,{height:b,version:1.1,width:a,xmlns:U});return c}function w(a){return a?a instanceof s||a instanceof t?a:a.tagName&&\"svg\"==a.tagName.toLowerCase()?new v(a):a.tagName&&\"object\"==a.tagName.toLowerCase()&&\"image/svg+xml\"==a.type?new v(a.contentDocument.getElementsByTagName(\"svg\")[0]):new s(a):a}function x(a,b){for(var c=0,d=a.length;d>c;c++){var e={type:a[c].type,attr:a[c].attr()},f=a[c].children();b.push(e),f.length&&x(f,e.childNodes=[])}}c.version=\"0.5.1\",c.toString=function(){return\"Snap v\"+this.version},c._={};var y={win:a.window,doc:a.window.document};c._.glob=y;var z=\"hasOwnProperty\",A=String,B=parseFloat,C=parseInt,D=Math,E=D.max,F=D.min,G=D.abs,H=(D.pow,D.PI),I=(D.round,\"\"),J=Object.prototype.toString,K=/^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,L=(c._.separator=/[,\\s]+/,/[\\s]*,[\\s]*/),M={hs:1,rg:1},N=/([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/gi,O=/([rstm])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/gi,P=/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\s]*,?[\\s]*/gi,Q=0,R=\"S\"+(+new Date).toString(36),S=function(a){return(a&&a.type?a.type:I)+R+(Q++).toString(36)},T=\"http://www.w3.org/1999/xlink\",U=\"http://www.w3.org/2000/svg\",V={};c.url=function(a){return\"url('#\"+a+\"')\"};c._.$=d,c._.id=S,c.format=function(){var a=/\\{([^\\}]+)\\}/g,b=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),\"function\"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+\"\"};return function(b,d){return A(b).replace(a,function(a,b){return c(a,b,d)})}}(),c._.clone=f,c._.cacher=i,c.rad=k,c.deg=l,c.sin=function(a){return D.sin(c.rad(a))},c.tan=function(a){return D.tan(c.rad(a))},c.cos=function(a){return D.cos(c.rad(a))},c.asin=function(a){return c.deg(D.asin(a))},c.acos=function(a){return c.deg(D.acos(a))},c.atan=function(a){return c.deg(D.atan(a))},c.atan2=function(a){return c.deg(D.atan2(a))},c.angle=j,c.len=function(a,b,d,e){return Math.sqrt(c.len2(a,b,d,e))},c.len2=function(a,b,c,d){return(a-c)*(a-c)+(b-d)*(b-d)},c.closestPoint=function(a,b,c){function d(a){var d=a.x-b,e=a.y-c;return d*d+e*e}for(var e,f,g,h,i=a.node,j=i.getTotalLength(),k=j/i.pathSegList.numberOfItems*.125,l=1/0,m=0;j>=m;m+=k)(h=d(g=i.getPointAtLength(m)))<l&&(e=g,f=m,l=h);for(k*=.5;k>.5;){var n,o,p,q,r,s;(p=f-k)>=0&&(r=d(n=i.getPointAtLength(p)))<l?(e=n,f=p,l=r):(q=f+k)<=j&&(s=d(o=i.getPointAtLength(q)))<l?(e=o,f=q,l=s):k*=.5}return e={x:e.x,y:e.y,length:f,distance:Math.sqrt(l)}},c.is=e,c.snapTo=function(a,b,c){if(c=e(c,\"finite\")?c:10,e(a,\"array\")){for(var d=a.length;d--;)if(G(a[d]-b)<=c)return a[d]}else{a=+a;var f=b%a;if(c>f)return b-f;if(f>a-c)return b-f+a}return b},c.getRGB=i(function(a){if(!a||(a=A(a)).indexOf(\"-\")+1)return{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:Z};if(\"none\"==a)return{r:-1,g:-1,b:-1,hex:\"none\",toString:Z};if(!(M[z](a.toLowerCase().substring(0,2))||\"#\"==a.charAt())&&(a=W(a)),!a)return{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:Z};var b,d,f,g,h,i,j=a.match(K);return j?(j[2]&&(f=C(j[2].substring(5),16),d=C(j[2].substring(3,5),16),b=C(j[2].substring(1,3),16)),j[3]&&(f=C((h=j[3].charAt(3))+h,16),d=C((h=j[3].charAt(2))+h,16),b=C((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4].split(L),b=B(i[0]),\"%\"==i[0].slice(-1)&&(b*=2.55),d=B(i[1]),\"%\"==i[1].slice(-1)&&(d*=2.55),f=B(i[2]),\"%\"==i[2].slice(-1)&&(f*=2.55),\"rgba\"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(g/=100)),j[5]?(i=j[5].split(L),b=B(i[0]),\"%\"==i[0].slice(-1)&&(b/=100),d=B(i[1]),\"%\"==i[1].slice(-1)&&(d/=100),f=B(i[2]),\"%\"==i[2].slice(-1)&&(f/=100),(\"deg\"==i[0].slice(-3)||\"°\"==i[0].slice(-1))&&(b/=360),\"hsba\"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(g/=100),c.hsb2rgb(b,d,f,g)):j[6]?(i=j[6].split(L),b=B(i[0]),\"%\"==i[0].slice(-1)&&(b/=100),d=B(i[1]),\"%\"==i[1].slice(-1)&&(d/=100),f=B(i[2]),\"%\"==i[2].slice(-1)&&(f/=100),(\"deg\"==i[0].slice(-3)||\"°\"==i[0].slice(-1))&&(b/=360),\"hsla\"==j[1].toLowerCase().slice(0,4)&&(g=B(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(g/=100),c.hsl2rgb(b,d,f,g)):(b=F(D.round(b),255),d=F(D.round(d),255),f=F(D.round(f),255),g=F(E(g,0),1),j={r:b,g:d,b:f,toString:Z},j.hex=\"#\"+(16777216|f|d<<8|b<<16).toString(16).slice(1),j.opacity=e(g,\"finite\")?g:1,j)):{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:Z}},c),c.hsb=i(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=i(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=i(function(a,b,c,d){if(e(d,\"finite\")){var f=D.round;return\"rgba(\"+[f(a),f(b),f(c),+d.toFixed(2)]+\")\"}return\"#\"+(16777216|c|b<<8|a<<16).toString(16).slice(1)});var W=function(a){var b=y.doc.getElementsByTagName(\"head\")[0]||y.doc.getElementsByTagName(\"svg\")[0],c=\"rgb(255, 0, 0)\";return(W=i(function(a){if(\"red\"==a.toLowerCase())return c;b.style.color=c,b.style.color=a;var d=y.doc.defaultView.getComputedStyle(b,I).getPropertyValue(\"color\");return d==c?null:d}))(a)},X=function(){return\"hsb(\"+[this.h,this.s,this.b]+\")\"},Y=function(){return\"hsl(\"+[this.h,this.s,this.l]+\")\"},Z=function(){return 1==this.opacity||null==this.opacity?this.hex:\"rgba(\"+[this.r,this.g,this.b,this.opacity]+\")\"},$=function(a,b,d){if(null==b&&e(a,\"object\")&&\"r\"in a&&\"g\"in a&&\"b\"in a&&(d=a.b,b=a.g,a=a.r),null==b&&e(a,string)){var f=c.getRGB(a);a=f.r,b=f.g,d=f.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},_=function(a,b,d,f){a=D.round(255*a),b=D.round(255*b),d=D.round(255*d);var g={r:a,g:b,b:d,opacity:e(f,\"finite\")?f:1,hex:c.rgb(a,b,d),toString:Z};return e(f,\"finite\")&&(g.opacity=f),g};c.color=function(a){var b;return e(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"b\"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):e(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"l\"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.opacity=1,a.hex=b.hex):(e(a,\"string\")&&(a=c.getRGB(a)),e(a,\"object\")&&\"r\"in a&&\"g\"in a&&\"b\"in a&&!(\"error\"in a)?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:\"none\"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1,a.error=1)),a.toString=Z,a},c.hsb2rgb=function(a,b,c,d){e(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"b\"in a&&(c=a.b,b=a.s,d=a.o,a=a.h),a*=360;var f,g,h,i,j;return a=a%360/60,j=c*b,i=j*(1-G(a%2-1)),f=g=h=c-j,a=~~a,f+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],_(f,g,h,d)},c.hsl2rgb=function(a,b,c,d){e(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"l\"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var f,g,h,i,j;return a=a%360/60,j=2*b*(.5>c?c:1-c),i=j*(1-G(a%2-1)),f=g=h=c-j/2,a=~~a,f+=[j,i,0,0,i,j][a],g+=[i,j,j,i,0,0][a],h+=[0,0,i,j,j,i][a],_(f,g,h,d)},c.rgb2hsb=function(a,b,c){c=$(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=E(a,b,c),g=f-F(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:X}},c.rgb2hsl=function(a,b,c){c=$(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=E(a,b,c),h=F(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:Y}},c.parsePathString=function(a){if(!a)return null;var b=c.path(a);if(b.arr)return c.path.clone(b.arr);var d={a:7,c:6,o:2,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,u:3,z:0},f=[];return e(a,\"array\")&&e(a[0],\"array\")&&(f=c.path.clone(a)),f.length||A(a).replace(N,function(a,b,c){var e=[],g=b.toLowerCase();if(c.replace(P,function(a,b){b&&e.push(+b)}),\"m\"==g&&e.length>2&&(f.push([b].concat(e.splice(0,2))),g=\"l\",b=\"m\"==b?\"l\":\"L\"),\"o\"==g&&1==e.length&&f.push([b,e[0]]),\"r\"==g)f.push([b].concat(e));else for(;e.length>=d[g]&&(f.push([b].concat(e.splice(0,d[g]))),d[g]););}),f.toString=c.path.toString,b.arr=c.path.clone(f),f};var aa=c.parseTransformString=function(a){if(!a)return null;var b=[];return e(a,\"array\")&&e(a[0],\"array\")&&(b=c.path.clone(a)),b.length||A(a).replace(O,function(a,c,d){var e=[];c.toLowerCase();d.replace(P,function(a,b){b&&e.push(+b)}),b.push([c].concat(e))}),b.toString=c.path.toString,b};c._.svgTransform2string=m,c._.rgTransform=/^[a-z][\\s]*-?\\.?\\d/i,c._.transform2matrix=n,c._unit2px=q;y.doc.contains||y.doc.compareDocumentPosition?function(a,b){var c=9==a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a==d||!(!d||1!=d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b;)if(b=b.parentNode,b==a)return!0;return!1};c._.getSomeDefs=o,c._.getSomeSVG=p,c.select=function(a){return a=A(a).replace(/([^\\\\]):/g,\"$1\\\\:\"),w(y.doc.querySelector(a))},c.selectAll=function(a){for(var b=y.doc.querySelectorAll(a),d=(c.set||Array)(),e=0;e<b.length;e++)d.push(w(b[e]));return d},setInterval(function(){for(var a in V)if(V[z](a)){var b=V[a],c=b.node;(\"svg\"!=b.type&&!c.ownerSVGElement||\"svg\"==b.type&&(!c.parentNode||\"ownerSVGElement\"in c.parentNode&&!c.ownerSVGElement))&&delete V[a]}},1e4),s.prototype.attr=function(a,c){var d=this,f=d.node;if(!a){if(1!=f.nodeType)return{text:f.nodeValue};for(var g=f.attributes,h={},i=0,j=g.length;j>i;i++)h[g[i].nodeName]=g[i].nodeValue;return h}if(e(a,\"string\")){if(!(arguments.length>1))return b(\"snap.util.getattr.\"+a,d).firstDefined();var k={};k[a]=c,a=k}for(var l in a)a[z](l)&&b(\"snap.util.attr.\"+l,d,a[l]);return d},c.parse=function(a){var b=y.doc.createDocumentFragment(),c=!0,d=y.doc.createElement(\"div\");if(a=A(a),a.match(/^\\s*<\\s*svg(?:\\s|>)/)||(a=\"<svg>\"+a+\"</svg>\",c=!1),d.innerHTML=a,a=d.getElementsByTagName(\"svg\")[0])if(c)b=a;else for(;a.firstChild;)b.appendChild(a.firstChild);return new t(b)},c.fragment=function(){for(var a=Array.prototype.slice.call(arguments,0),b=y.doc.createDocumentFragment(),d=0,e=a.length;e>d;d++){var f=a[d];f.node&&f.node.nodeType&&b.appendChild(f.node),f.nodeType&&b.appendChild(f),\"string\"==typeof f&&b.appendChild(c.parse(f).node)}return new t(b)},c._.make=u,c._.wrap=w,v.prototype.el=function(a,b){var c=u(a,this.node);return b&&c.attr(b),c},s.prototype.children=function(){for(var a=[],b=this.node.childNodes,d=0,e=b.length;e>d;d++)a[d]=c(b[d]);return a},s.prototype.toJSON=function(){var a=[];return x([this],a),a[0]},b.on(\"snap.util.getattr\",function(){var a=b.nt();a=a.substring(a.lastIndexOf(\".\")+1);var c=a.replace(/[A-Z]/g,function(a){return\"-\"+a.toLowerCase()});return ba[z](c)?this.node.ownerDocument.defaultView.getComputedStyle(this.node,null).getPropertyValue(c):d(this.node,a)});var ba={\"alignment-baseline\":0,\"baseline-shift\":0,clip:0,\"clip-path\":0,\"clip-rule\":0,color:0,\"color-interpolation\":0,\"color-interpolation-filters\":0,\"color-profile\":0,\"color-rendering\":0,cursor:0,direction:0,display:0,\"dominant-baseline\":0,\"enable-background\":0,fill:0,\"fill-opacity\":0,\"fill-rule\":0,filter:0,\"flood-color\":0,\"flood-opacity\":0,font:0,\"font-family\":0,\"font-size\":0,\"font-size-adjust\":0,\"font-stretch\":0,\"font-style\":0,\"font-variant\":0,\"font-weight\":0,\"glyph-orientation-horizontal\":0,\"glyph-orientation-vertical\":0,\"image-rendering\":0,kerning:0,\"letter-spacing\":0,\"lighting-color\":0,marker:0,\"marker-end\":0,\"marker-mid\":0,\"marker-start\":0,mask:0,opacity:0,overflow:0,\"pointer-events\":0,\"shape-rendering\":0,\"stop-color\":0,\"stop-opacity\":0,stroke:0,\"stroke-dasharray\":0,\"stroke-dashoffset\":0,\"stroke-linecap\":0,\"stroke-linejoin\":0,\"stroke-miterlimit\":0,\"stroke-opacity\":0,\"stroke-width\":0,\"text-anchor\":0,\"text-decoration\":0,\"text-rendering\":0,\"unicode-bidi\":0,visibility:0,\"word-spacing\":0,\"writing-mode\":0};b.on(\"snap.util.attr\",function(a){var c=b.nt(),e={};c=c.substring(c.lastIndexOf(\".\")+1),e[c]=a;var f=c.replace(/-(\\w)/gi,function(a,b){return b.toUpperCase()}),g=c.replace(/[A-Z]/g,function(a){return\"-\"+a.toLowerCase()});ba[z](g)?this.node.style[f]=null==a?I:a:d(this.node,e)}),function(a){}(v.prototype),c.ajax=function(a,c,d,f){var g=new XMLHttpRequest,h=S();if(g){if(e(c,\"function\"))f=d,d=c,c=null;else if(e(c,\"object\")){var i=[];for(var j in c)c.hasOwnProperty(j)&&i.push(encodeURIComponent(j)+\"=\"+encodeURIComponent(c[j]));c=i.join(\"&\")}return g.open(c?\"POST\":\"GET\",a,!0),c&&(g.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),g.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\")),d&&(b.once(\"snap.ajax.\"+h+\".0\",d),b.once(\"snap.ajax.\"+h+\".200\",d),b.once(\"snap.ajax.\"+h+\".304\",d)),g.onreadystatechange=function(){4==g.readyState&&b(\"snap.ajax.\"+h+\".\"+g.status,f,g)},4==g.readyState?g:(g.send(c),g)}},c.load=function(a,b,d){c.ajax(a,function(a){var e=c.parse(a.responseText);d?b.call(d,e):b(e)})};var ca=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,h=e.clientLeft||d.clientLeft||0,i=b.top+(g.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(g.win.pageXOffset||e.scrollLeft||d.scrollLeft)-h;return{y:i,x:j}};return c.getElementByPoint=function(a,b){var c=this,d=(c.canvas,y.doc.elementFromPoint(a,b));if(y.win.opera&&\"svg\"==d.tagName){var e=ca(d),f=d.createSVGRect();f.x=a-e.x,f.y=b-e.y,f.width=f.height=1;var g=d.getIntersectionList(f,null);g.length&&(d=g[g.length-1])}return d?w(d):null},c.plugin=function(a){a(c,s,v,y,t)},y.win.Snap=c,c}(a||this);return d.plugin(function(c,d,e,f,g){function h(a,b){if(null==b){var d=!0;if(b=\"linearGradient\"==a.type||\"radialGradient\"==a.type?a.node.getAttribute(\"gradientTransform\"):\"pattern\"==a.type?a.node.getAttribute(\"patternTransform\"):a.node.getAttribute(\"transform\"),!b)return new c.Matrix;b=c._.svgTransform2string(b)}else b=c._.rgTransform.test(b)?m(b).replace(/\\.{3}|\\u2026/g,a._.transform||\"\"):c._.svgTransform2string(b),l(b,\"array\")&&(b=c.path?c.path.toString.call(b):m(b)),a._.transform=b;var e=c._.transform2matrix(b,a.getBBox(1));return d?e:void(a.matrix=e)}function i(a){function b(a,b){var d=o(a.node,b);d=d&&d.match(g),d=d&&d[2],d&&\"#\"==d.charAt()&&(d=d.substring(1),d&&(i[d]=(i[d]||[]).concat(function(d){var e={};e[b]=c.url(d),o(a.node,e)})))}function d(a){var b=o(a.node,\"xlink:href\");b&&\"#\"==b.charAt()&&(b=b.substring(1),b&&(i[b]=(i[b]||[]).concat(function(b){a.attr(\"xlink:href\",\"#\"+b)})))}for(var e,f=a.selectAll(\"*\"),g=/^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,h=[],i={},j=0,k=f.length;k>j;j++){e=f[j],b(e,\"fill\"),b(e,\"stroke\"),b(e,\"filter\"),b(e,\"mask\"),b(e,\"clip-path\"),d(e);var l=o(e.node,\"id\");l&&(o(e.node,{id:e.id}),h.push({old:l,id:e.id}))}for(j=0,k=h.length;k>j;j++){var m=i[h[j].old];if(m)for(var n=0,p=m.length;p>n;n++)m[n](h[j].id)}}function j(a){return function(){var b=a?\"<\"+this.type:\"\",c=this.node.attributes,d=this.node.childNodes;if(a)for(var e=0,f=c.length;f>e;e++)b+=\" \"+c[e].name+'=\"'+c[e].value.replace(/\"/g,'\\\\\"')+'\"';if(d.length){for(a&&(b+=\">\"),e=0,f=d.length;f>e;e++)3==d[e].nodeType?b+=d[e].nodeValue:1==d[e].nodeType&&(b+=s(d[e]).toString());a&&(b+=\"</\"+this.type+\">\")}else a&&(b+=\"/>\");return b}}var k=d.prototype,l=c.is,m=String,n=c._unit2px,o=c._.$,p=c._.make,q=c._.getSomeDefs,r=\"hasOwnProperty\",s=c._.wrap;k.getBBox=function(a){if(\"tspan\"==this.type)return c._.box(this.node.getClientRects().item(0));if(!c.Matrix||!c.path)return this.node.getBBox();var b=this,d=new c.Matrix;if(b.removed)return c._.box();for(;\"use\"==b.type;)if(a||(d=d.add(b.transform().localMatrix.translate(b.attr(\"x\")||0,b.attr(\"y\")||0))),b.original)b=b.original;else{var e=b.attr(\"xlink:href\");b=b.original=b.node.ownerDocument.getElementById(e.substring(e.indexOf(\"#\")+1))}var f=b._,g=c.path.get[b.type]||c.path.get.deflt;try{return a?(f.bboxwt=g?c.path.getBBox(b.realPath=g(b)):c._.box(b.node.getBBox()),c._.box(f.bboxwt)):(b.realPath=g(b),b.matrix=b.transform().localMatrix,f.bbox=c.path.getBBox(c.path.map(b.realPath,d.add(b.matrix))),c._.box(f.bbox))}catch(h){return c._.box()}};var t=function(){return this.string};k.transform=function(a){var b=this._;if(null==a){for(var d,e=this,f=new c.Matrix(this.node.getCTM()),g=h(this),i=[g],j=new c.Matrix,k=g.toTransformString(),l=m(g)==m(this.matrix)?m(b.transform):k;\"svg\"!=e.type&&(e=e.parent());)i.push(h(e));for(d=i.length;d--;)j.add(i[d]);return{string:l,globalMatrix:f,totalMatrix:j,localMatrix:g,diffMatrix:f.clone().add(g.invert()),global:f.toTransformString(),total:j.toTransformString(),local:k,toString:t}}return a instanceof c.Matrix?(this.matrix=a,this._.transform=a.toTransformString()):h(this,a),this.node&&(\"linearGradient\"==this.type||\"radialGradient\"==this.type?o(this.node,{gradientTransform:this.matrix}):\"pattern\"==this.type?o(this.node,{patternTransform:this.matrix}):o(this.node,{transform:this.matrix})),this},k.parent=function(){return s(this.node.parentNode)},k.append=k.add=function(a){if(a){if(\"set\"==a.type){var b=this;return a.forEach(function(a){b.add(a)}),this}a=s(a),this.node.appendChild(a.node),a.paper=this.paper}return this},k.appendTo=function(a){return a&&(a=s(a),a.append(this)),this},k.prepend=function(a){if(a){if(\"set\"==a.type){var b,c=this;return a.forEach(function(a){b?b.after(a):c.prepend(a),b=a}),this}a=s(a);var d=a.parent();this.node.insertBefore(a.node,this.node.firstChild),this.add&&this.add(),a.paper=this.paper,this.parent()&&this.parent().add(),d&&d.add()}return this},k.prependTo=function(a){return a=s(a),a.prepend(this),this},k.before=function(a){if(\"set\"==a.type){var b=this;return a.forEach(function(a){var c=a.parent();b.node.parentNode.insertBefore(a.node,b.node),c&&c.add()}),this.parent().add(),this}a=s(a);var c=a.parent();return this.node.parentNode.insertBefore(a.node,this.node),this.parent()&&this.parent().add(),c&&c.add(),a.paper=this.paper,this},k.after=function(a){a=s(a);var b=a.parent();return this.node.nextSibling?this.node.parentNode.insertBefore(a.node,this.node.nextSibling):this.node.parentNode.appendChild(a.node),this.parent()&&this.parent().add(),b&&b.add(),a.paper=this.paper,this},k.insertBefore=function(a){a=s(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},k.insertAfter=function(a){a=s(a);var b=this.parent();return a.node.parentNode.insertBefore(this.node,a.node.nextSibling),this.paper=a.paper,b&&b.add(),a.parent()&&a.parent().add(),this},k.remove=function(){var a=this.parent();return this.node.parentNode&&this.node.parentNode.removeChild(this.node),delete this.paper,this.removed=!0,a&&a.add(),this},k.select=function(a){return s(this.node.querySelector(a))},k.selectAll=function(a){for(var b=this.node.querySelectorAll(a),d=(c.set||Array)(),e=0;e<b.length;e++)d.push(s(b[e]));return d},k.asPX=function(a,b){return null==b&&(b=this.attr(a)),+n(this,a,b)},k.use=function(){var a,b=this.node.id;return b||(b=this.id,o(this.node,{id:b})),a=\"linearGradient\"==this.type||\"radialGradient\"==this.type||\"pattern\"==this.type?p(this.type,this.node.parentNode):p(\"use\",this.node.parentNode),o(a.node,{\"xlink:href\":\"#\"+b}),a.original=this,a},k.clone=function(){var a=s(this.node.cloneNode(!0));return o(a.node,\"id\")&&o(a.node,{id:a.id}),i(a),a.insertAfter(this),a},k.toDefs=function(){var a=q(this);return a.appendChild(this.node),this},k.pattern=k.toPattern=function(a,b,c,d){var e=p(\"pattern\",q(this));return null==a&&(a=this.getBBox()),l(a,\"object\")&&\"x\"in a&&(b=a.y,c=a.width,d=a.height,a=a.x),o(e.node,{x:a,y:b,width:c,height:d,patternUnits:\"userSpaceOnUse\",id:e.id,viewBox:[a,b,c,d].join(\" \")}),e.node.appendChild(this.node),e},k.marker=function(a,b,c,d,e,f){var g=p(\"marker\",q(this));return null==a&&(a=this.getBBox()),l(a,\"object\")&&\"x\"in a&&(b=a.y,c=a.width,d=a.height,e=a.refX||a.cx,f=a.refY||a.cy,a=a.x),o(g.node,{viewBox:[a,b,c,d].join(\" \"),markerWidth:c,markerHeight:d,orient:\"auto\",refX:e||0,refY:f||0,id:g.id}),g.node.appendChild(this.node),g};var u={};k.data=function(a,d){var e=u[this.id]=u[this.id]||{};if(0==arguments.length)return b(\"snap.data.get.\"+this.id,this,e,null),e;if(1==arguments.length){if(c.is(a,\"object\")){for(var f in a)a[r](f)&&this.data(f,a[f]);return this}return b(\"snap.data.get.\"+this.id,this,e[a],a),e[a]}return e[a]=d,b(\"snap.data.set.\"+this.id,this,d,a),this},k.removeData=function(a){return null==a?u[this.id]={}:u[this.id]&&delete u[this.id][a],this},k.outerSVG=k.toString=j(1),k.innerSVG=j(),k.toDataURL=function(){if(a&&a.btoa){var b=this.getBBox(),d=c.format('<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"{width}\" height=\"{height}\" viewBox=\"{x} {y} {width} {height}\">{contents}</svg>',{x:+b.x.toFixed(3),y:+b.y.toFixed(3),width:+b.width.toFixed(3),height:+b.height.toFixed(3),\ncontents:this.outerSVG()});return\"data:image/svg+xml;base64,\"+btoa(unescape(encodeURIComponent(d)))}},g.prototype.select=k.select,g.prototype.selectAll=k.selectAll}),d.plugin(function(a,d,e,f,g){function h(a,b,c){return function(d){var e=d.slice(a,b);return 1==e.length&&(e=e[0]),c?c(e):e}}var i=d.prototype,j=a.is,k=String,l=\"hasOwnProperty\",m=function(a,b,d,e){\"function\"!=typeof d||d.length||(e=d,d=c.linear),this.attr=a,this.dur=b,d&&(this.easing=d),e&&(this.callback=e)};a._.Animation=m,a.animation=function(a,b,c,d){return new m(a,b,c,d)},i.inAnim=function(){var a=this,b=[];for(var c in a.anims)a.anims[l](c)&&!function(a){b.push({anim:new m(a._attrs,a.dur,a.easing,a._callback),mina:a,curStatus:a.status(),status:function(b){return a.status(b)},stop:function(){a.stop()}})}(a.anims[c]);return b},a.animate=function(a,d,e,f,g,h){\"function\"!=typeof g||g.length||(h=g,g=c.linear);var i=c.time(),j=c(a,d,i,i+f,c.time,e,g);return h&&b.once(\"mina.finish.\"+j.id,h),j},i.stop=function(){for(var a=this.inAnim(),b=0,c=a.length;c>b;b++)a[b].stop();return this},i.animate=function(a,d,e,f){\"function\"!=typeof e||e.length||(f=e,e=c.linear),a instanceof m&&(f=a.callback,e=a.easing,d=a.dur,a=a.attr);var g,i,n,o,p=[],q=[],r={},s=this;for(var t in a)if(a[l](t)){s.equal?(o=s.equal(t,k(a[t])),g=o.from,i=o.to,n=o.f):(g=+s.attr(t),i=+a[t]);var u=j(g,\"array\")?g.length:1;r[t]=h(p.length,p.length+u,n),p=p.concat(g),q=q.concat(i)}var v=c.time(),w=c(p,q,v,v+d,c.time,function(a){var b={};for(var c in r)r[l](c)&&(b[c]=r[c](a));s.attr(b)},e);return s.anims[w.id]=w,w._attrs=a,w._callback=f,b(\"snap.animcreated.\"+s.id,w),b.once(\"mina.finish.\"+w.id,function(){b.off(\"mina.*.\"+w.id),delete s.anims[w.id],f&&f.call(s)}),b.once(\"mina.stop.\"+w.id,function(){b.off(\"mina.*.\"+w.id),delete s.anims[w.id]}),s}}),d.plugin(function(a,b,c,d,e){function f(a,b,c,d,e,f){return null==b&&\"[object SVGMatrix]\"==g.call(a)?(this.a=a.a,this.b=a.b,this.c=a.c,this.d=a.d,this.e=a.e,void(this.f=a.f)):void(null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0))}var g=Object.prototype.toString,h=String,i=Math,j=\"\";!function(b){function c(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var b=i.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}b.add=function(a,b,c,d,e,g){if(a&&a instanceof f)return this.add(a.a,a.b,a.c,a.d,a.e,a.f);var h=a*this.a+b*this.c,i=a*this.b+b*this.d;return this.e+=e*this.a+g*this.c,this.f+=e*this.b+g*this.d,this.c=c*this.a+d*this.c,this.d=c*this.b+d*this.d,this.a=h,this.b=i,this},f.prototype.multLeft=function(a,b,c,d,e,g){if(a&&a instanceof f)return this.multLeft(a.a,a.b,a.c,a.d,a.e,a.f);var h=a*this.a+c*this.b,i=a*this.c+c*this.d,j=a*this.e+c*this.f+e;return this.b=b*this.a+d*this.b,this.d=b*this.c+d*this.d,this.f=b*this.e+d*this.f+g,this.a=h,this.c=i,this.e=j,this},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new f(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new f(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){return this.e+=a*this.a+b*this.c,this.f+=a*this.b+b*this.d,this},b.scale=function(a,b,c,d){return null==b&&(b=a),(c||d)&&this.translate(c,d),this.a*=a,this.b*=a,this.c*=b,this.d*=b,(c||d)&&this.translate(-c,-d),this},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+i.cos(b).toFixed(9),f=+i.sin(b).toFixed(9);return this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.skewX=function(a){return this.skew(a,0)},b.skewY=function(a){return this.skew(0,a)},b.skew=function(b,c){b=b||0,c=c||0,b=a.rad(b),c=a.rad(c);var d=i.tan(b).toFixed(9),e=i.tan(c).toFixed(9);return this.add(1,e,d,1,0,0)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[h.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return\"matrix(\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+\")\"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.determinant=function(){return this.a*this.d-this.b*this.c},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.b],[this.c,this.d]];b.scalex=i.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=i.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley,this.determinant()<0&&(b.scalex=-b.scalex);var f=e[0][1],g=e[1][1];return 0>g?(b.rotate=a.deg(i.acos(g)),0>f&&(b.rotate=360-b.rotate)):b.rotate=a.deg(i.asin(f)),b.isSimple=!(+b.shear.toFixed(9)||b.scalex.toFixed(9)!=b.scaley.toFixed(9)&&b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate,b},b.toTransformString=function(a){var b=a||this.split();return+b.shear.toFixed(9)?\"m\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]:(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?\"t\"+[+b.dx.toFixed(4),+b.dy.toFixed(4)]:j)+(b.rotate?\"r\"+[+b.rotate.toFixed(4),0,0]:j)+(1!=b.scalex||1!=b.scaley?\"s\"+[b.scalex,b.scaley,0,0]:j))}}(f.prototype),a.Matrix=f,a.matrix=function(a,b,c,d,e,g){return new f(a,b,c,d,e,g)}}),d.plugin(function(a,c,d,e,f){function g(d){return function(e){if(b.stop(),e instanceof f&&1==e.node.childNodes.length&&(\"radialGradient\"==e.node.firstChild.tagName||\"linearGradient\"==e.node.firstChild.tagName||\"pattern\"==e.node.firstChild.tagName)&&(e=e.node.firstChild,n(this).appendChild(e),e=l(e)),e instanceof c)if(\"radialGradient\"==e.type||\"linearGradient\"==e.type||\"pattern\"==e.type){e.node.id||p(e.node,{id:e.id});var g=q(e.node.id)}else g=e.attr(d);else if(g=a.color(e),g.error){var h=a(n(this).ownerSVGElement).gradient(e);h?(h.node.id||p(h.node,{id:h.id}),g=q(h.node.id)):g=e}else g=r(g);var i={};i[d]=g,p(this.node,i),this.node.style[d]=t}}function h(a){b.stop(),a==+a&&(a+=\"px\"),this.node.style.fontSize=a}function i(a){for(var b=[],c=a.childNodes,d=0,e=c.length;e>d;d++){var f=c[d];3==f.nodeType&&b.push(f.nodeValue),\"tspan\"==f.tagName&&(1==f.childNodes.length&&3==f.firstChild.nodeType?b.push(f.firstChild.nodeValue):b.push(i(f)))}return b}function j(){return b.stop(),this.node.style.fontSize}var k=a._.make,l=a._.wrap,m=a.is,n=a._.getSomeDefs,o=/^url\\((['\"]?)([^)]+)\\1\\)$/,p=a._.$,q=a.url,r=String,s=a._.separator,t=\"\";a.deurl=function(a){var b=String(a).match(o);return b?b[2]:a},b.on(\"snap.util.attr.mask\",function(a){if(a instanceof c||a instanceof f){if(b.stop(),a instanceof f&&1==a.node.childNodes.length&&(a=a.node.firstChild,n(this).appendChild(a),a=l(a)),\"mask\"==a.type)var d=a;else d=k(\"mask\",n(this)),d.node.appendChild(a.node);!d.node.id&&p(d.node,{id:d.id}),p(this.node,{mask:q(d.id)})}}),function(a){b.on(\"snap.util.attr.clip\",a),b.on(\"snap.util.attr.clip-path\",a),b.on(\"snap.util.attr.clipPath\",a)}(function(a){if(a instanceof c||a instanceof f){b.stop();for(var d,e=a.node;e;){if(\"clipPath\"===e.nodeName){d=new c(e);break}if(\"svg\"===e.nodeName){d=void 0;break}e=e.parentNode}d||(d=k(\"clipPath\",n(this)),d.node.appendChild(a.node),!d.node.id&&p(d.node,{id:d.id})),p(this.node,{\"clip-path\":q(d.node.id||d.id)})}}),b.on(\"snap.util.attr.fill\",g(\"fill\")),b.on(\"snap.util.attr.stroke\",g(\"stroke\"));var u=/^([lr])(?:\\(([^)]*)\\))?(.*)$/i;b.on(\"snap.util.grad.parse\",function(a){function b(a,b){for(var c=(b-h)/(a-i),d=i;a>d;d++)f[d].offset=+(+h+c*(d-i)).toFixed(2);i=a,h=b}a=r(a);var c=a.match(u);if(!c)return null;var d=c[1],e=c[2],f=c[3];e=e.split(/\\s*,\\s*/).map(function(a){return+a==a?+a:a}),1==e.length&&0==e[0]&&(e=[]),f=f.split(\"-\"),f=f.map(function(a){a=a.split(\":\");var b={color:a[0]};return a[1]&&(b.offset=parseFloat(a[1])),b});var g=f.length,h=0,i=0;g--;for(var j=0;g>j;j++)\"offset\"in f[j]&&b(j,f[j].offset);return f[g].offset=f[g].offset||100,b(g,f[g].offset),{type:d,params:e,stops:f}}),b.on(\"snap.util.attr.d\",function(c){b.stop(),m(c,\"array\")&&m(c[0],\"array\")&&(c=a.path.toString.call(c)),c=r(c),c.match(/[ruo]/i)&&(c=a.path.toAbsolute(c)),p(this.node,{d:c})})(-1),b.on(\"snap.util.attr.#text\",function(a){b.stop(),a=r(a);for(var c=e.doc.createTextNode(a);this.node.firstChild;)this.node.removeChild(this.node.firstChild);this.node.appendChild(c)})(-1),b.on(\"snap.util.attr.path\",function(a){b.stop(),this.attr({d:a})})(-1),b.on(\"snap.util.attr.class\",function(a){b.stop(),this.node.className.baseVal=a})(-1),b.on(\"snap.util.attr.viewBox\",function(a){var c;c=m(a,\"object\")&&\"x\"in a?[a.x,a.y,a.width,a.height].join(\" \"):m(a,\"array\")?a.join(\" \"):a,p(this.node,{viewBox:c}),b.stop()})(-1),b.on(\"snap.util.attr.transform\",function(a){this.transform(a),b.stop()})(-1),b.on(\"snap.util.attr.r\",function(a){\"rect\"==this.type&&(b.stop(),p(this.node,{rx:a,ry:a}))})(-1),b.on(\"snap.util.attr.textpath\",function(a){if(b.stop(),\"text\"==this.type){var d,e,f;if(!a&&this.textPath){for(e=this.textPath;e.node.firstChild;)this.node.appendChild(e.node.firstChild);return e.remove(),void delete this.textPath}if(m(a,\"string\")){var g=n(this),h=l(g.parentNode).path(a);g.appendChild(h.node),d=h.id,h.attr({id:d})}else a=l(a),a instanceof c&&(d=a.attr(\"id\"),d||(d=a.id,a.attr({id:d})));if(d)if(e=this.textPath,f=this.node,e)e.attr({\"xlink:href\":\"#\"+d});else{for(e=p(\"textPath\",{\"xlink:href\":\"#\"+d});f.firstChild;)e.appendChild(f.firstChild);f.appendChild(e),this.textPath=l(e)}}})(-1),b.on(\"snap.util.attr.text\",function(a){if(\"text\"==this.type){for(var c=this.node,d=function(a){var b=p(\"tspan\");if(m(a,\"array\"))for(var c=0;c<a.length;c++)b.appendChild(d(a[c]));else b.appendChild(e.doc.createTextNode(a));return b.normalize&&b.normalize(),b};c.firstChild;)c.removeChild(c.firstChild);for(var f=d(a);f.firstChild;)c.appendChild(f.firstChild)}b.stop()})(-1),b.on(\"snap.util.attr.fontSize\",h)(-1),b.on(\"snap.util.attr.font-size\",h)(-1),b.on(\"snap.util.getattr.transform\",function(){return b.stop(),this.transform()})(-1),b.on(\"snap.util.getattr.textpath\",function(){return b.stop(),this.textPath})(-1),function(){function c(c){return function(){b.stop();var d=e.doc.defaultView.getComputedStyle(this.node,null).getPropertyValue(\"marker-\"+c);return\"none\"==d?d:a(e.doc.getElementById(d.match(o)[1]))}}function d(a){return function(c){b.stop();var d=\"marker\"+a.charAt(0).toUpperCase()+a.substring(1);if(\"\"==c||!c)return void(this.node.style[d]=\"none\");if(\"marker\"==c.type){var e=c.node.id;return e||p(c.node,{id:c.id}),void(this.node.style[d]=q(e))}}}b.on(\"snap.util.getattr.marker-end\",c(\"end\"))(-1),b.on(\"snap.util.getattr.markerEnd\",c(\"end\"))(-1),b.on(\"snap.util.getattr.marker-start\",c(\"start\"))(-1),b.on(\"snap.util.getattr.markerStart\",c(\"start\"))(-1),b.on(\"snap.util.getattr.marker-mid\",c(\"mid\"))(-1),b.on(\"snap.util.getattr.markerMid\",c(\"mid\"))(-1),b.on(\"snap.util.attr.marker-end\",d(\"end\"))(-1),b.on(\"snap.util.attr.markerEnd\",d(\"end\"))(-1),b.on(\"snap.util.attr.marker-start\",d(\"start\"))(-1),b.on(\"snap.util.attr.markerStart\",d(\"start\"))(-1),b.on(\"snap.util.attr.marker-mid\",d(\"mid\"))(-1),b.on(\"snap.util.attr.markerMid\",d(\"mid\"))(-1)}(),b.on(\"snap.util.getattr.r\",function(){return\"rect\"==this.type&&p(this.node,\"rx\")==p(this.node,\"ry\")?(b.stop(),p(this.node,\"rx\")):void 0})(-1),b.on(\"snap.util.getattr.text\",function(){if(\"text\"==this.type||\"tspan\"==this.type){b.stop();var a=i(this.node);return 1==a.length?a[0]:a}})(-1),b.on(\"snap.util.getattr.#text\",function(){return this.node.textContent})(-1),b.on(\"snap.util.getattr.fill\",function(c){if(!c){b.stop();var d=b(\"snap.util.getattr.fill\",this,!0).firstDefined();return a(a.deurl(d))||d}})(-1),b.on(\"snap.util.getattr.stroke\",function(c){if(!c){b.stop();var d=b(\"snap.util.getattr.stroke\",this,!0).firstDefined();return a(a.deurl(d))||d}})(-1),b.on(\"snap.util.getattr.viewBox\",function(){b.stop();var c=p(this.node,\"viewBox\");return c?(c=c.split(s),a._.box(+c[0],+c[1],+c[2],+c[3])):void 0})(-1),b.on(\"snap.util.getattr.points\",function(){var a=p(this.node,\"points\");return b.stop(),a?a.split(s):void 0})(-1),b.on(\"snap.util.getattr.path\",function(){var a=p(this.node,\"d\");return b.stop(),a})(-1),b.on(\"snap.util.getattr.class\",function(){return this.node.className.baseVal})(-1),b.on(\"snap.util.getattr.fontSize\",j)(-1),b.on(\"snap.util.getattr.font-size\",j)(-1)}),d.plugin(function(a,b,c,d,e){var f=/\\S+/g,g=String,h=b.prototype;h.addClass=function(a){var b,c,d,e,h=g(a||\"\").match(f)||[],i=this.node,j=i.className.baseVal,k=j.match(f)||[];if(h.length){for(b=0;d=h[b++];)c=k.indexOf(d),~c||k.push(d);e=k.join(\" \"),j!=e&&(i.className.baseVal=e)}return this},h.removeClass=function(a){var b,c,d,e,h=g(a||\"\").match(f)||[],i=this.node,j=i.className.baseVal,k=j.match(f)||[];if(k.length){for(b=0;d=h[b++];)c=k.indexOf(d),~c&&k.splice(c,1);e=k.join(\" \"),j!=e&&(i.className.baseVal=e)}return this},h.hasClass=function(a){var b=this.node,c=b.className.baseVal,d=c.match(f)||[];return!!~d.indexOf(a)},h.toggleClass=function(a,b){if(null!=b)return b?this.addClass(a):this.removeClass(a);var c,d,e,g,h=(a||\"\").match(f)||[],i=this.node,j=i.className.baseVal,k=j.match(f)||[];for(c=0;e=h[c++];)d=k.indexOf(e),~d?k.splice(d,1):k.push(e);return g=k.join(\" \"),j!=g&&(i.className.baseVal=g),this}}),d.plugin(function(a,c,d,e,f){function g(a){return a}function h(a){return function(b){return+b.toFixed(3)+a}}var i={\"+\":function(a,b){return a+b},\"-\":function(a,b){return a-b},\"/\":function(a,b){return a/b},\"*\":function(a,b){return a*b}},j=String,k=/[a-z]+$/i,l=/^\\s*([+\\-\\/*])\\s*=\\s*([\\d.eE+\\-]+)\\s*([^\\d\\s]+)?\\s*$/;b.on(\"snap.util.attr\",function(a){var c=j(a).match(l);if(c){var d=b.nt(),e=d.substring(d.lastIndexOf(\".\")+1),f=this.attr(e),g={};b.stop();var h=c[3]||\"\",m=f.match(k),n=i[c[1]];if(m&&m==h?a=n(parseFloat(f),+c[2]):(f=this.asPX(e),a=n(this.asPX(e),this.asPX(e,c[2]+h))),isNaN(f)||isNaN(a))return;g[e]=a,this.attr(g)}})(-10),b.on(\"snap.util.equal\",function(a,c){var d=j(this.attr(a)||\"\"),e=j(c).match(l);if(e){b.stop();var f=e[3]||\"\",m=d.match(k),n=i[e[1]];return m&&m==f?{from:parseFloat(d),to:n(parseFloat(d),+e[2]),f:h(m)}:(d=this.asPX(a),{from:d,to:n(d,this.asPX(a,e[2]+f)),f:g})}})(-10)}),d.plugin(function(c,d,e,f,g){var h=e.prototype,i=c.is;h.rect=function(a,b,c,d,e,f){var g;return null==f&&(f=e),i(a,\"object\")&&\"[object Object]\"==a?g=a:null!=a&&(g={x:a,y:b,width:c,height:d},null!=e&&(g.rx=e,g.ry=f)),this.el(\"rect\",g)},h.circle=function(a,b,c){var d;return i(a,\"object\")&&\"[object Object]\"==a?d=a:null!=a&&(d={cx:a,cy:b,r:c}),this.el(\"circle\",d)};var j=function(){function a(){this.parentNode.removeChild(this)}return function(b,c){var d=f.doc.createElement(\"img\"),e=f.doc.body;d.style.cssText=\"position:absolute;left:-9999em;top:-9999em\",d.onload=function(){c.call(d),d.onload=d.onerror=null,e.removeChild(d)},d.onerror=a,e.appendChild(d),d.src=b}}();h.image=function(a,b,d,e,f){var g=this.el(\"image\");if(i(a,\"object\")&&\"src\"in a)g.attr(a);else if(null!=a){var h={\"xlink:href\":a,preserveAspectRatio:\"none\"};null!=b&&null!=d&&(h.x=b,h.y=d),null!=e&&null!=f?(h.width=e,h.height=f):j(a,function(){c._.$(g.node,{width:this.offsetWidth,height:this.offsetHeight})}),c._.$(g.node,h)}return g},h.ellipse=function(a,b,c,d){var e;return i(a,\"object\")&&\"[object Object]\"==a?e=a:null!=a&&(e={cx:a,cy:b,rx:c,ry:d}),this.el(\"ellipse\",e)},h.path=function(a){var b;return i(a,\"object\")&&!i(a,\"array\")?b=a:a&&(b={d:a}),this.el(\"path\",b)},h.group=h.g=function(a){var b=this.el(\"g\");return 1==arguments.length&&a&&!a.type?b.attr(a):arguments.length&&b.add(Array.prototype.slice.call(arguments,0)),b},h.svg=function(a,b,c,d,e,f,g,h){var j={};return i(a,\"object\")&&null==b?j=a:(null!=a&&(j.x=a),null!=b&&(j.y=b),null!=c&&(j.width=c),null!=d&&(j.height=d),null!=e&&null!=f&&null!=g&&null!=h&&(j.viewBox=[e,f,g,h])),this.el(\"svg\",j)},h.mask=function(a){var b=this.el(\"mask\");return 1==arguments.length&&a&&!a.type?b.attr(a):arguments.length&&b.add(Array.prototype.slice.call(arguments,0)),b},h.ptrn=function(a,b,c,d,e,f,g,h){if(i(a,\"object\"))var j=a;else j={patternUnits:\"userSpaceOnUse\"},a&&(j.x=a),b&&(j.y=b),null!=c&&(j.width=c),null!=d&&(j.height=d),null!=e&&null!=f&&null!=g&&null!=h?j.viewBox=[e,f,g,h]:j.viewBox=[a||0,b||0,c||0,d||0];return this.el(\"pattern\",j)},h.use=function(a){return null!=a?(a instanceof d&&(a.attr(\"id\")||a.attr({id:c._.id(a)}),a=a.attr(\"id\")),\"#\"==String(a).charAt()&&(a=a.substring(1)),this.el(\"use\",{\"xlink:href\":\"#\"+a})):d.prototype.use.call(this)},h.symbol=function(a,b,c,d){var e={};return null!=a&&null!=b&&null!=c&&null!=d&&(e.viewBox=[a,b,c,d]),this.el(\"symbol\",e)},h.text=function(a,b,c){var d={};return i(a,\"object\")?d=a:null!=a&&(d={x:a,y:b,text:c||\"\"}),this.el(\"text\",d)},h.line=function(a,b,c,d){var e={};return i(a,\"object\")?e=a:null!=a&&(e={x1:a,x2:c,y1:b,y2:d}),this.el(\"line\",e)},h.polyline=function(a){arguments.length>1&&(a=Array.prototype.slice.call(arguments,0));var b={};return i(a,\"object\")&&!i(a,\"array\")?b=a:null!=a&&(b={points:a}),this.el(\"polyline\",b)},h.polygon=function(a){arguments.length>1&&(a=Array.prototype.slice.call(arguments,0));var b={};return i(a,\"object\")&&!i(a,\"array\")?b=a:null!=a&&(b={points:a}),this.el(\"polygon\",b)},function(){function d(){return this.selectAll(\"stop\")}function e(a,b){var d=l(\"stop\"),e={offset:+b+\"%\"};a=c.color(a),e[\"stop-color\"]=a.hex,a.opacity<1&&(e[\"stop-opacity\"]=a.opacity),l(d,e);for(var f,g=this.stops(),h=0;h<g.length;h++){var i=parseFloat(g[h].attr(\"offset\"));if(i>b){this.node.insertBefore(d,g[h].node),f=!0;break}}return f||this.node.appendChild(d),this}function f(){if(\"linearGradient\"==this.type){var a=l(this.node,\"x1\")||0,b=l(this.node,\"x2\")||1,d=l(this.node,\"y1\")||0,e=l(this.node,\"y2\")||0;return c._.box(a,d,math.abs(b-a),math.abs(e-d))}var f=this.node.cx||.5,g=this.node.cy||.5,h=this.node.r||0;return c._.box(f-h,g-h,2*h,2*h)}function g(a){var d=a,e=this.stops();if(\"string\"==typeof a&&(d=b(\"snap.util.grad.parse\",null,\"l(0,0,0,1)\"+a).firstDefined().stops),c.is(d,\"array\")){for(var f=0;f<e.length;f++)if(d[f]){var g=c.color(d[f].color),h={offset:d[f].offset+\"%\"};h[\"stop-color\"]=g.hex,g.opacity<1&&(h[\"stop-opacity\"]=g.opacity),e[f].attr(h)}else e[f].remove();for(f=e.length;f<d.length;f++)this.addStop(d[f].color,d[f].offset);return this}}function i(a,c){var d,e=b(\"snap.util.grad.parse\",null,c).firstDefined();if(!e)return null;e.params.unshift(a),d=\"l\"==e.type.toLowerCase()?j.apply(0,e.params):k.apply(0,e.params),e.type!=e.type.toLowerCase()&&l(d.node,{gradientUnits:\"userSpaceOnUse\"});for(var f=e.stops,g=f.length,h=0;g>h;h++){var i=f[h];d.addStop(i.color,i.offset)}return d}function j(a,b,h,i,j){var k=c._.make(\"linearGradient\",a);return k.stops=d,k.addStop=e,k.getBBox=f,k.setStops=g,null!=b&&l(k.node,{x1:b,y1:h,x2:i,y2:j}),k}function k(a,b,g,h,i,j){var k=c._.make(\"radialGradient\",a);return k.stops=d,k.addStop=e,k.getBBox=f,null!=b&&l(k.node,{cx:b,cy:g,r:h}),null!=i&&null!=j&&l(k.node,{fx:i,fy:j}),k}var l=c._.$;h.gradient=function(a){return i(this.defs,a)},h.gradientLinear=function(a,b,c,d){return j(this.defs,a,b,c,d)},h.gradientRadial=function(a,b,c,d,e){return k(this.defs,a,b,c,d,e)},h.toString=function(){var a,b=this.node.ownerDocument,d=b.createDocumentFragment(),e=b.createElement(\"div\"),f=this.node.cloneNode(!0);return d.appendChild(e),e.appendChild(f),c._.$(f,{xmlns:\"http://www.w3.org/2000/svg\"}),a=e.innerHTML,d.removeChild(d.firstChild),a},h.toDataURL=function(){return a&&a.btoa?\"data:image/svg+xml;base64,\"+btoa(unescape(encodeURIComponent(this))):void 0},h.clear=function(){for(var a,b=this.node.firstChild;b;)a=b.nextSibling,\"defs\"!=b.tagName?b.parentNode.removeChild(b):h.clear.call({node:b}),b=a}}()}),d.plugin(function(a,b,c,d){function e(a){var b=e.ps=e.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[M](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]}function f(a,b,c,d){return null==a&&(a=b=c=d=0),null==b&&(b=a.y,c=a.width,d=a.height,a=a.x),{x:a,y:b,width:c,w:c,height:d,h:d,x2:a+c,y2:b+d,cx:a+c/2,cy:b+d/2,r1:P.min(c,d)/2,r2:P.max(c,d)/2,r0:P.sqrt(c*c+d*d)/2,path:y(a,b,c,d),vb:[a,b,c,d].join(\" \")}}function g(){return this.join(\",\").replace(N,\"$1\")}function h(a){var b=L(a);return b.toString=g,b}function i(a,b,c,d,e,f,g,h,i){return null==i?p(a,b,c,d,e,f,g,h):k(a,b,c,d,e,f,g,h,q(a,b,c,d,e,f,g,h,i))}function j(c,d){function e(a){return+(+a).toFixed(3)}return a._.cacher(function(a,f,g){a instanceof b&&(a=a.attr(\"d\")),a=G(a);for(var h,j,l,m,n,o=\"\",p={},q=0,r=0,s=a.length;s>r;r++){if(l=a[r],\"M\"==l[0])h=+l[1],j=+l[2];else{if(m=i(h,j,l[1],l[2],l[3],l[4],l[5],l[6]),q+m>f){if(d&&!p.start){if(n=i(h,j,l[1],l[2],l[3],l[4],l[5],l[6],f-q),o+=[\"C\"+e(n.start.x),e(n.start.y),e(n.m.x),e(n.m.y),e(n.x),e(n.y)],g)return o;p.start=o,o=[\"M\"+e(n.x),e(n.y)+\"C\"+e(n.n.x),e(n.n.y),e(n.end.x),e(n.end.y),e(l[5]),e(l[6])].join(),q+=m,h=+l[5],j=+l[6];continue}if(!c&&!d)return n=i(h,j,l[1],l[2],l[3],l[4],l[5],l[6],f-q)}q+=m,h=+l[5],j=+l[6]}o+=l.shift()+l}return p.end=o,n=c?q:d?p:k(h,j,l[0],l[1],l[2],l[3],l[4],l[5],1)},null,a._.clone)}function k(a,b,c,d,e,f,g,h,i){var j=1-i,k=T(j,3),l=T(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*P.atan2(q-s,r-t)/Q;return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}}function l(b,c,d,e,g,h,i,j){a.is(b,\"array\")||(b=[b,c,d,e,g,h,i,j]);var k=F.apply(null,b);return f(k.min.x,k.min.y,k.max.x-k.min.x,k.max.y-k.min.y)}function m(a,b,c){return b>=a.x&&b<=a.x+a.width&&c>=a.y&&c<=a.y+a.height}function n(a,b){return a=f(a),b=f(b),m(b,a.x,a.y)||m(b,a.x2,a.y)||m(b,a.x,a.y2)||m(b,a.x2,a.y2)||m(a,b.x,b.y)||m(a,b.x2,b.y)||m(a,b.x,b.y2)||m(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)}function o(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function p(a,b,c,d,e,f,g,h,i){null==i&&(i=1),i=i>1?1:0>i?0:i;for(var j=i/2,k=12,l=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0,p=0;k>p;p++){var q=j*l[p]+j,r=o(q,a,c,e,g),s=o(q,b,d,f,h),t=r*r+s*s;n+=m[p]*P.sqrt(t)}return j*n}function q(a,b,c,d,e,f,g,h,i){if(!(0>i||p(a,b,c,d,e,f,g,h)<i)){var j,k=1,l=k/2,m=k-l,n=.01;for(j=p(a,b,c,d,e,f,g,h,m);U(j-i)>n;)l/=2,m+=(i>j?1:-1)*l,j=p(a,b,c,d,e,f,g,h,m);return m}}function r(a,b,c,d,e,f,g,h){if(!(S(a,c)<R(e,g)||R(a,c)>S(e,g)||S(b,d)<R(f,h)||R(b,d)>S(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+R(a,c).toFixed(2)||n>+S(a,c).toFixed(2)||n<+R(e,g).toFixed(2)||n>+S(e,g).toFixed(2)||o<+R(b,d).toFixed(2)||o>+S(b,d).toFixed(2)||o<+R(f,h).toFixed(2)||o>+S(f,h).toFixed(2)))return{x:l,y:m}}}}function s(a,b,c){var d=l(a),e=l(b);if(!n(d,e))return c?0:[];for(var f=p.apply(0,a),g=p.apply(0,b),h=~~(f/8),i=~~(g/8),j=[],m=[],o={},q=c?0:[],s=0;h+1>s;s++){var t=k.apply(0,a.concat(s/h));j.push({x:t.x,y:t.y,t:s/h})}for(s=0;i+1>s;s++)t=k.apply(0,b.concat(s/i)),m.push({x:t.x,y:t.y,t:s/i});for(s=0;h>s;s++)for(var u=0;i>u;u++){var v=j[s],w=j[s+1],x=m[u],y=m[u+1],z=U(w.x-v.x)<.001?\"y\":\"x\",A=U(y.x-x.x)<.001?\"y\":\"x\",B=r(v.x,v.y,w.x,w.y,x.x,x.y,y.x,y.y);if(B){if(o[B.x.toFixed(4)]==B.y.toFixed(4))continue;o[B.x.toFixed(4)]=B.y.toFixed(4);var C=v.t+U((B[z]-v[z])/(w[z]-v[z]))*(w.t-v.t),D=x.t+U((B[A]-x[A])/(y[A]-x[A]))*(y.t-x.t);C>=0&&1>=C&&D>=0&&1>=D&&(c?q++:q.push({x:B.x,y:B.y,t1:C,t2:D}))}}return q}function t(a,b){return v(a,b)}function u(a,b){return v(a,b,1)}function v(a,b,c){a=G(a),b=G(b);for(var d,e,f,g,h,i,j,k,l,m,n=c?0:[],o=0,p=a.length;p>o;o++){var q=a[o];if(\"M\"==q[0])d=h=q[1],e=i=q[2];else{\"C\"==q[0]?(l=[d,e].concat(q.slice(1)),d=l[6],e=l[7]):(l=[d,e,d,e,h,i,h,i],d=h,e=i);for(var r=0,t=b.length;t>r;r++){var u=b[r];if(\"M\"==u[0])f=j=u[1],g=k=u[2];else{\"C\"==u[0]?(m=[f,g].concat(u.slice(1)),f=m[6],g=m[7]):(m=[f,g,f,g,j,k,j,k],f=j,g=k);var v=s(l,m,c);if(c)n+=v;else{for(var w=0,x=v.length;x>w;w++)v[w].segment1=o,v[w].segment2=r,v[w].bez1=l,v[w].bez2=m;n=n.concat(v)}}}}}return n}function w(a,b,c){var d=x(a);return m(d,b,c)&&v(a,[[\"M\",b,c],[\"H\",d.x2+10]],1)%2==1}function x(a){var b=e(a);if(b.bbox)return L(b.bbox);if(!a)return f();a=G(a);for(var c,d=0,g=0,h=[],i=[],j=0,k=a.length;k>j;j++)if(c=a[j],\"M\"==c[0])d=c[1],g=c[2],h.push(d),i.push(g);else{var l=F(d,g,c[1],c[2],c[3],c[4],c[5],c[6]);h=h.concat(l.min.x,l.max.x),i=i.concat(l.min.y,l.max.y),d=c[5],g=c[6]}var m=R.apply(0,h),n=R.apply(0,i),o=S.apply(0,h),p=S.apply(0,i),q=f(m,n,o-m,p-n);return b.bbox=L(q),q}function y(a,b,c,d,e){if(e)return[[\"M\",+a+ +e,b],[\"l\",c-2*e,0],[\"a\",e,e,0,0,1,e,e],[\"l\",0,d-2*e],[\"a\",e,e,0,0,1,-e,e],[\"l\",2*e-c,0],[\"a\",e,e,0,0,1,-e,-e],[\"l\",0,2*e-d],[\"a\",e,e,0,0,1,e,-e],[\"z\"]];var f=[[\"M\",a,b],[\"l\",c,0],[\"l\",0,d],[\"l\",-c,0],[\"z\"]];return f.toString=g,f}function z(a,b,c,d,e){if(null==e&&null==d&&(d=c),a=+a,b=+b,c=+c,d=+d,null!=e)var f=Math.PI/180,h=a+c*Math.cos(-d*f),i=a+c*Math.cos(-e*f),j=b+c*Math.sin(-d*f),k=b+c*Math.sin(-e*f),l=[[\"M\",h,j],[\"A\",c,c,0,+(e-d>180),0,i,k]];else l=[[\"M\",a,b],[\"m\",0,-d],[\"a\",c,d,0,1,1,0,2*d],[\"a\",c,d,0,1,1,0,-2*d],[\"z\"]];return l.toString=g,l}function A(b){var c=e(b),d=String.prototype.toLowerCase;if(c.rel)return h(c.rel);a.is(b,\"array\")&&a.is(b&&b[0],\"array\")||(b=a.parsePathString(b));var f=[],i=0,j=0,k=0,l=0,m=0;\"M\"==b[0][0]&&(i=b[0][1],j=b[0][2],k=i,l=j,m++,f.push([\"M\",i,j]));for(var n=m,o=b.length;o>n;n++){var p=f[n]=[],q=b[n];if(q[0]!=d.call(q[0]))switch(p[0]=d.call(q[0]),p[0]){case\"a\":p[1]=q[1],p[2]=q[2],p[3]=q[3],p[4]=q[4],p[5]=q[5],p[6]=+(q[6]-i).toFixed(3),p[7]=+(q[7]-j).toFixed(3);break;case\"v\":p[1]=+(q[1]-j).toFixed(3);break;case\"m\":k=q[1],l=q[2];default:for(var r=1,s=q.length;s>r;r++)p[r]=+(q[r]-(r%2?i:j)).toFixed(3)}else{p=f[n]=[],\"m\"==q[0]&&(k=q[1]+i,l=q[2]+j);for(var t=0,u=q.length;u>t;t++)f[n][t]=q[t]}var v=f[n].length;switch(f[n][0]){case\"z\":i=k,j=l;break;case\"h\":i+=+f[n][v-1];break;case\"v\":j+=+f[n][v-1];break;default:i+=+f[n][v-2],j+=+f[n][v-1]}}return f.toString=g,c.rel=h(f),f}function B(b){var c=e(b);if(c.abs)return h(c.abs);if(K(b,\"array\")&&K(b&&b[0],\"array\")||(b=a.parsePathString(b)),!b||!b.length)return[[\"M\",0,0]];var d,f=[],i=0,j=0,k=0,l=0,m=0;\"M\"==b[0][0]&&(i=+b[0][1],j=+b[0][2],k=i,l=j,m++,f[0]=[\"M\",i,j]);for(var n,o,p=3==b.length&&\"M\"==b[0][0]&&\"R\"==b[1][0].toUpperCase()&&\"Z\"==b[2][0].toUpperCase(),q=m,r=b.length;r>q;q++){if(f.push(n=[]),o=b[q],d=o[0],d!=d.toUpperCase())switch(n[0]=d.toUpperCase(),n[0]){case\"A\":n[1]=o[1],n[2]=o[2],n[3]=o[3],n[4]=o[4],n[5]=o[5],n[6]=+o[6]+i,n[7]=+o[7]+j;break;case\"V\":n[1]=+o[1]+j;break;case\"H\":n[1]=+o[1]+i;break;case\"R\":for(var s=[i,j].concat(o.slice(1)),t=2,u=s.length;u>t;t++)s[t]=+s[t]+i,s[++t]=+s[t]+j;f.pop(),f=f.concat(I(s,p));break;case\"O\":f.pop(),s=z(i,j,o[1],o[2]),s.push(s[0]),f=f.concat(s);break;case\"U\":f.pop(),f=f.concat(z(i,j,o[1],o[2],o[3])),n=[\"U\"].concat(f[f.length-1].slice(-2));break;case\"M\":k=+o[1]+i,l=+o[2]+j;default:for(t=1,u=o.length;u>t;t++)n[t]=+o[t]+(t%2?i:j)}else if(\"R\"==d)s=[i,j].concat(o.slice(1)),f.pop(),f=f.concat(I(s,p)),n=[\"R\"].concat(o.slice(-2));else if(\"O\"==d)f.pop(),s=z(i,j,o[1],o[2]),s.push(s[0]),f=f.concat(s);else if(\"U\"==d)f.pop(),f=f.concat(z(i,j,o[1],o[2],o[3])),n=[\"U\"].concat(f[f.length-1].slice(-2));else for(var v=0,w=o.length;w>v;v++)n[v]=o[v];if(d=d.toUpperCase(),\"O\"!=d)switch(n[0]){case\"Z\":i=+k,j=+l;break;case\"H\":i=n[1];break;case\"V\":j=n[1];break;case\"M\":k=n[n.length-2],l=n[n.length-1];default:i=n[n.length-2],j=n[n.length-1]}}return f.toString=g,c.abs=h(f),f}function C(a,b,c,d){return[a,b,c,d,c,d]}function D(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]}function E(b,c,d,e,f,g,h,i,j,k){var l,m=120*Q/180,n=Q/180*(+f||0),o=[],p=a._.cacher(function(a,b,c){var d=a*P.cos(c)-b*P.sin(c),e=a*P.sin(c)+b*P.cos(c);return{x:d,y:e}});if(!d||!e)return[b,c,i,j,i,j];if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(b,c,-n),b=l.x,c=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(P.cos(Q/180*f),P.sin(Q/180*f),(b-i)/2),r=(c-j)/2,s=q*q/(d*d)+r*r/(e*e);s>1&&(s=P.sqrt(s),d=s*d,e=s*e);var t=d*d,u=e*e,v=(g==h?-1:1)*P.sqrt(U((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*d*r/e+(b+i)/2,x=v*-e*q/d+(c+j)/2,y=P.asin(((c-x)/e).toFixed(9)),z=P.asin(((j-x)/e).toFixed(9));y=w>b?Q-y:y,z=w>i?Q-z:z,0>y&&(y=2*Q+y),0>z&&(z=2*Q+z),h&&y>z&&(y-=2*Q),!h&&z>y&&(z-=2*Q)}var A=z-y;if(U(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+d*P.cos(z),j=x+e*P.sin(z),o=E(i,j,d,e,f,0,h,C,D,[z,B,w,x])}A=z-y;var F=P.cos(y),G=P.sin(y),H=P.cos(z),I=P.sin(z),J=P.tan(A/4),K=4/3*d*J,L=4/3*e*J,M=[b,c],N=[b+K*G,c-L*F],O=[i+K*I,j-L*H],R=[i,j];if(N[0]=2*M[0]-N[0],N[1]=2*M[1]-N[1],k)return[N,O,R].concat(o);o=[N,O,R].concat(o).join().split(\",\");for(var S=[],T=0,V=o.length;V>T;T++)S[T]=T%2?p(o[T-1],o[T],n).y:p(o[T],o[T+1],n).x;return S}function F(a,b,c,d,e,f,g,h){for(var i,j,k,l,m,n,o,p,q=[],r=[[],[]],s=0;2>s;++s)if(0==s?(j=6*a-12*c+6*e,i=-3*a+9*c-9*e+3*g,k=3*c-3*a):(j=6*b-12*d+6*f,i=-3*b+9*d-9*f+3*h,k=3*d-3*b),U(i)<1e-12){if(U(j)<1e-12)continue;l=-k/j,l>0&&1>l&&q.push(l)}else o=j*j-4*k*i,p=P.sqrt(o),0>o||(m=(-j+p)/(2*i),m>0&&1>m&&q.push(m),n=(-j-p)/(2*i),n>0&&1>n&&q.push(n));for(var t,u=q.length,v=u;u--;)l=q[u],t=1-l,r[0][u]=t*t*t*a+3*t*t*l*c+3*t*l*l*e+l*l*l*g,r[1][u]=t*t*t*b+3*t*t*l*d+3*t*l*l*f+l*l*l*h;return r[0][v]=a,r[1][v]=b,r[0][v+1]=g,r[1][v+1]=h,r[0].length=r[1].length=v+2,{min:{x:R.apply(0,r[0]),y:R.apply(0,r[1])},max:{x:S.apply(0,r[0]),y:S.apply(0,r[1])}}}function G(a,b){var c=!b&&e(a);if(!b&&c.curve)return h(c.curve);for(var d=B(a),f=b&&B(b),g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},i={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},j=(function(a,b,c){var d,e;if(!a)return[\"C\",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case\"M\":b.X=a[1],b.Y=a[2];break;case\"A\":a=[\"C\"].concat(E.apply(0,[b.x,b.y].concat(a.slice(1))));break;case\"S\":\"C\"==c||\"S\"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=[\"C\",d,e].concat(a.slice(1));break;case\"T\":\"Q\"==c||\"T\"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=[\"C\"].concat(D(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case\"Q\":b.qx=a[1],b.qy=a[2],a=[\"C\"].concat(D(b.x,b.y,a[1],a[2],a[3],a[4]));break;case\"L\":a=[\"C\"].concat(C(b.x,b.y,a[1],a[2]));break;case\"H\":a=[\"C\"].concat(C(b.x,b.y,a[1],b.y));break;case\"V\":a=[\"C\"].concat(C(b.x,b.y,b.x,a[1]));break;case\"Z\":a=[\"C\"].concat(C(b.x,b.y,b.X,b.Y))}return a}),k=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)m[b]=\"A\",f&&(n[b]=\"A\"),a.splice(b++,0,[\"C\"].concat(c.splice(0,6)));a.splice(b,1),r=S(d.length,f&&f.length||0)}},l=function(a,b,c,e,g){a&&b&&\"M\"==a[g][0]&&\"M\"!=b[g][0]&&(b.splice(g,0,[\"M\",e.x,e.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],r=S(d.length,f&&f.length||0))},m=[],n=[],o=\"\",p=\"\",q=0,r=S(d.length,f&&f.length||0);r>q;q++){d[q]&&(o=d[q][0]),\"C\"!=o&&(m[q]=o,q&&(p=m[q-1])),d[q]=j(d[q],g,p),\"A\"!=m[q]&&\"C\"==o&&(m[q]=\"C\"),k(d,q),f&&(f[q]&&(o=f[q][0]),\"C\"!=o&&(n[q]=o,q&&(p=n[q-1])),f[q]=j(f[q],i,p),\"A\"!=n[q]&&\"C\"==o&&(n[q]=\"C\"),k(f,q)),l(d,f,g,i,q),l(f,d,i,g,q);var s=d[q],t=f&&f[q],u=s.length,v=f&&t.length;g.x=s[u-2],g.y=s[u-1],g.bx=O(s[u-4])||g.x,g.by=O(s[u-3])||g.y,i.bx=f&&(O(t[v-4])||i.x),i.by=f&&(O(t[v-3])||i.y),i.x=f&&t[v-2],i.y=f&&t[v-1]}return f||(c.curve=h(d)),f?[d,f]:d}function H(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=G(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a}function I(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push([\"C\",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}var J=b.prototype,K=a.is,L=a._.clone,M=\"hasOwnProperty\",N=/,?([a-z]),?/gi,O=parseFloat,P=Math,Q=P.PI,R=P.min,S=P.max,T=P.pow,U=P.abs,V=j(1),W=j(),X=j(0,1),Y=a._unit2px,Z={path:function(a){return a.attr(\"path\")},circle:function(a){var b=Y(a);return z(b.cx,b.cy,b.r)},ellipse:function(a){var b=Y(a);\nreturn z(b.cx||0,b.cy||0,b.rx,b.ry)},rect:function(a){var b=Y(a);return y(b.x||0,b.y||0,b.width,b.height,b.rx,b.ry)},image:function(a){var b=Y(a);return y(b.x||0,b.y||0,b.width,b.height)},line:function(a){return\"M\"+[a.attr(\"x1\")||0,a.attr(\"y1\")||0,a.attr(\"x2\"),a.attr(\"y2\")]},polyline:function(a){return\"M\"+a.attr(\"points\")},polygon:function(a){return\"M\"+a.attr(\"points\")+\"z\"},deflt:function(a){var b=a.node.getBBox();return y(b.x,b.y,b.width,b.height)}};a.path=e,a.path.getTotalLength=V,a.path.getPointAtLength=W,a.path.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return X(a,b).end;var d=X(a,c,1);return b?X(d,b).end:d},J.getTotalLength=function(){return this.node.getTotalLength?this.node.getTotalLength():void 0},J.getPointAtLength=function(a){return W(this.attr(\"d\"),a)},J.getSubpath=function(b,c){return a.path.getSubpath(this.attr(\"d\"),b,c)},a._.box=f,a.path.findDotsAtSegment=k,a.path.bezierBBox=l,a.path.isPointInsideBBox=m,a.closest=function(b,c,d,e){for(var g=100,h=f(b-g/2,c-g/2,g,g),i=[],j=d[0].hasOwnProperty(\"x\")?function(a){return{x:d[a].x,y:d[a].y}}:function(a){return{x:d[a],y:e[a]}},k=0;1e6>=g&&!k;){for(var l=0,n=d.length;n>l;l++){var o=j(l);if(m(h,o.x,o.y)){k++,i.push(o);break}}k||(g*=2,h=f(b-g/2,c-g/2,g,g))}if(1e6!=g){var p,q=1/0;for(l=0,n=i.length;n>l;l++){var r=a.len(b,c,i[l].x,i[l].y);q>r&&(q=r,i[l].len=r,p=i[l])}return p}},a.path.isBBoxIntersect=n,a.path.intersection=t,a.path.intersectionNumber=u,a.path.isPointInside=w,a.path.getBBox=x,a.path.get=Z,a.path.toRelative=A,a.path.toAbsolute=B,a.path.toCubic=G,a.path.map=H,a.path.toString=g,a.path.clone=h}),d.plugin(function(a,d,e,f){var g=Math.max,h=Math.min,i=function(a){if(this.items=[],this.bindings={},this.length=0,this.type=\"set\",a)for(var b=0,c=a.length;c>b;b++)a[b]&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},j=i.prototype;j.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],a&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},j.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},j.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this},j.animate=function(d,e,f,g){\"function\"!=typeof f||f.length||(g=f,f=c.linear),d instanceof a._.Animation&&(g=d.callback,f=d.easing,e=f.dur,d=d.attr);var h=arguments;if(a.is(d,\"array\")&&a.is(h[h.length-1],\"array\"))var i=!0;var j,k=function(){j?this.b=j:j=this.b},l=0,m=this,n=g&&function(){++l==m.length&&g.call(this)};return this.forEach(function(a,c){b.once(\"snap.animcreated.\"+a.id,k),i?h[c]&&a.animate.apply(a,h[c]):a.animate(d,e,f,n)})},j.remove=function(){for(;this.length;)this.pop().remove();return this},j.bind=function(a,b,c){var d={};if(\"function\"==typeof b)this.bindings[a]=b;else{var e=c||a;this.bindings[a]=function(a){d[e]=a,b.attr(d)}}return this},j.attr=function(a){var b={};for(var c in a)this.bindings[c]?this.bindings[c](a[c]):b[c]=a[c];for(var d=0,e=this.items.length;e>d;d++)this.items[d].attr(b);return this},j.clear=function(){for(;this.length;)this.pop()},j.splice=function(a,b,c){a=0>a?g(this.length+a,0):a,b=g(0,h(this.length-a,b));var d,e=[],f=[],j=[];for(d=2;d<arguments.length;d++)j.push(arguments[d]);for(d=0;b>d;d++)f.push(this[a+d]);for(;d<this.length-a;d++)e.push(this[a+d]);var k=j.length;for(d=0;d<k+e.length;d++)this.items[a+d]=this[a+d]=k>d?j[d]:e[d-k];for(d=this.items.length=this.length-=b-k;this[d];)delete this[d++];return new i(f)},j.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0;return!1},j.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},j.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=h.apply(0,a),b=h.apply(0,b),c=g.apply(0,c),d=g.apply(0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b,cx:a+(c-a)/2,cy:b+(d-b)/2}},j.clone=function(a){a=new i;for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},j.toString=function(){return\"Snap‘s set\"},j.type=\"set\",a.Set=i,a.set=function(){var a=new i;return arguments.length&&a.push.apply(a,Array.prototype.slice.call(arguments,0)),a}}),d.plugin(function(a,c,d,e){function f(a){var b=a[0];switch(b.toLowerCase()){case\"t\":return[b,0,0];case\"m\":return[b,1,0,0,1,0,0];case\"r\":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case\"s\":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}}function g(b,c,d){b=b||new a.Matrix,c=c||new a.Matrix,b=a.parseTransformString(b.toTransformString())||[],c=a.parseTransformString(c.toTransformString())||[];for(var e,g,h,i,j=Math.max(b.length,c.length),k=[],n=[],o=0;j>o;o++){if(h=b[o]||f(c[o]),i=c[o]||f(h),h[0]!=i[0]||\"r\"==h[0].toLowerCase()&&(h[2]!=i[2]||h[3]!=i[3])||\"s\"==h[0].toLowerCase()&&(h[3]!=i[3]||h[4]!=i[4])){b=a._.transform2matrix(b,d()),c=a._.transform2matrix(c,d()),k=[[\"m\",b.a,b.b,b.c,b.d,b.e,b.f]],n=[[\"m\",c.a,c.b,c.c,c.d,c.e,c.f]];break}for(k[o]=[],n[o]=[],e=0,g=Math.max(h.length,i.length);g>e;e++)e in h&&(k[o][e]=h[e]),e in i&&(n[o][e]=i[e])}return{from:m(k),to:m(n),f:l(k)}}function h(a){return a}function i(a){return function(b){return+b.toFixed(3)+a}}function j(a){return a.join(\" \")}function k(b){return a.rgb(b[0],b[1],b[2],b[3])}function l(a){var b,c,d,e,f,g,h=0,i=[];for(b=0,c=a.length;c>b;b++){for(f=\"[\",g=['\"'+a[b][0]+'\"'],d=1,e=a[b].length;e>d;d++)g[d]=\"val[\"+h++ +\"]\";f+=g+\"]\",i[b]=f}return Function(\"val\",\"return Snap.path.toString.call([\"+i+\"])\")}function m(a){for(var b=[],c=0,d=a.length;d>c;c++)for(var e=1,f=a[c].length;f>e;e++)b.push(a[c][e]);return b}function n(a){return isFinite(a)}function o(b,c){return a.is(b,\"array\")&&a.is(c,\"array\")?b.toString()==c.toString():!1}var p={},q=/[%a-z]+$/i,r=String;p.stroke=p.fill=\"colour\",c.prototype.equal=function(a,c){return b(\"snap.util.equal\",this,a,c).firstDefined()},b.on(\"snap.util.equal\",function(b,c){var d,e,f=r(this.attr(b)||\"\"),s=this;if(\"colour\"==p[b])return d=a.color(f),e=a.color(c),{from:[d.r,d.g,d.b,d.opacity],to:[e.r,e.g,e.b,e.opacity],f:k};if(\"viewBox\"==b)return d=this.attr(b).vb.split(\" \").map(Number),e=c.split(\" \").map(Number),{from:d,to:e,f:j};if(\"transform\"==b||\"gradientTransform\"==b||\"patternTransform\"==b)return\"string\"==typeof c&&(c=r(c).replace(/\\.{3}|\\u2026/g,f)),f=this.matrix,c=a._.rgTransform.test(c)?a._.transform2matrix(c,this.getBBox()):a._.transform2matrix(a._.svgTransform2string(c),this.getBBox()),g(f,c,function(){return s.getBBox(1)});if(\"d\"==b||\"path\"==b)return d=a.path.toCubic(f,c),{from:m(d[0]),to:m(d[1]),f:l(d[0])};if(\"points\"==b)return d=r(f).split(a._.separator),e=r(c).split(a._.separator),{from:d,to:e,f:function(a){return a}};if(n(f)&&n(c))return{from:parseFloat(f),to:parseFloat(c),f:h};var t=f.match(q),u=r(c).match(q);return t&&o(t,u)?{from:parseFloat(f),to:parseFloat(c),f:i(t)}:{from:this.asPX(b),to:this.asPX(b,c),f:h}})}),d.plugin(function(a,c,d,e){for(var f=c.prototype,g=\"hasOwnProperty\",h=(\"createTouch\"in e.doc),i=[\"click\",\"dblclick\",\"mousedown\",\"mousemove\",\"mouseout\",\"mouseover\",\"mouseup\",\"touchstart\",\"touchmove\",\"touchend\",\"touchcancel\"],j={mousedown:\"touchstart\",mousemove:\"touchmove\",mouseup:\"touchend\"},k=(function(a,b){var c=\"y\"==a?\"scrollTop\":\"scrollLeft\",d=b&&b.node?b.node.ownerDocument:e.doc;return d[c in d.documentElement?\"documentElement\":\"body\"][c]}),l=function(){return this.originalEvent.preventDefault()},m=function(){return this.originalEvent.stopPropagation()},n=function(a,b,c,d){var e=h&&j[b]?j[b]:b,f=function(e){var f=k(\"y\",d),i=k(\"x\",d);if(h&&j[g](b))for(var n=0,o=e.targetTouches&&e.targetTouches.length;o>n;n++)if(e.targetTouches[n].target==a||a.contains(e.targetTouches[n].target)){var p=e;e=e.targetTouches[n],e.originalEvent=p,e.preventDefault=l,e.stopPropagation=m;break}var q=e.clientX+i,r=e.clientY+f;return c.call(d,e,q,r)};return b!==e&&a.addEventListener(b,f,!1),a.addEventListener(e,f,!1),function(){return b!==e&&a.removeEventListener(b,f,!1),a.removeEventListener(e,f,!1),!0}},o=[],p=function(a){for(var c,d=a.clientX,e=a.clientY,f=k(\"y\"),g=k(\"x\"),i=o.length;i--;){if(c=o[i],h){for(var j,l=a.touches&&a.touches.length;l--;)if(j=a.touches[l],j.identifier==c.el._drag.id||c.el.node.contains(j.target)){d=j.clientX,e=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var m=c.el.node;m.nextSibling,m.parentNode,m.style.display;d+=g,e+=f,b(\"snap.drag.move.\"+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},q=function(c){a.unmousemove(p).unmouseup(q);for(var d,e=o.length;e--;)d=o[e],d.el._drag={},b(\"snap.drag.end.\"+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c),b.off(\"snap.drag.*.\"+d.el.id);o=[]},r=i.length;r--;)!function(b){a[b]=f[b]=function(c,d){if(a.is(c,\"function\"))this.events=this.events||[],this.events.push({name:b,f:c,unbind:n(this.node||document,b,c,d||this)});else for(var e=0,f=this.events.length;f>e;e++)if(this.events[e].name==b)try{this.events[e].f.call(this)}catch(g){}return this},a[\"un\"+b]=f[\"un\"+b]=function(a){for(var c=this.events||[],d=c.length;d--;)if(c[d].name==b&&(c[d].f==a||!a))return c[d].unbind(),c.splice(d,1),!c.length&&delete this.events,this;return this}}(i[r]);f.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},f.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var s=[];f.drag=function(c,d,e,f,g,h){function i(i,j,l){(i.originalEvent||i).preventDefault(),k._drag.x=j,k._drag.y=l,k._drag.id=i.identifier,!o.length&&a.mousemove(p).mouseup(q),o.push({el:k,move_scope:f,start_scope:g,end_scope:h}),d&&b.on(\"snap.drag.start.\"+k.id,d),c&&b.on(\"snap.drag.move.\"+k.id,c),e&&b.on(\"snap.drag.end.\"+k.id,e),b(\"snap.drag.start.\"+k.id,g||f||k,j,l,i)}function j(a,c,d){b(\"snap.draginit.\"+k.id,k,a,c,d)}var k=this;if(!arguments.length){var l;return k.drag(function(a,b){this.attr({transform:l+(l?\"T\":\"t\")+[a,b]})},function(){l=this.transform().local})}return b.on(\"snap.draginit.\"+k.id,i),k._drag={},s.push({el:k,start:i,init:j}),k.mousedown(j),k},f.undrag=function(){for(var c=s.length;c--;)s[c].el==this&&(this.unmousedown(s[c].init),s.splice(c,1),b.unbind(\"snap.drag.*.\"+this.id),b.unbind(\"snap.draginit.\"+this.id));return!s.length&&a.unmousemove(p).unmouseup(q),this}}),d.plugin(function(a,c,d,e){var f=(c.prototype,d.prototype),g=/^\\s*url\\((.+)\\)/,h=String,i=a._.$;a.filter={},f.filter=function(b){var d=this;\"svg\"!=d.type&&(d=d.paper);var e=a.parse(h(b)),f=a._.id(),g=(d.node.offsetWidth,d.node.offsetHeight,i(\"filter\"));return i(g,{id:f,filterUnits:\"userSpaceOnUse\"}),g.appendChild(e.node),d.defs.appendChild(g),new c(g)},b.on(\"snap.util.getattr.filter\",function(){b.stop();var c=i(this.node,\"filter\");if(c){var d=h(c).match(g);return d&&a.select(d[1])}}),b.on(\"snap.util.attr.filter\",function(d){if(d instanceof c&&\"filter\"==d.type){b.stop();var e=d.node.id;e||(i(d.node,{id:d.id}),e=d.id),i(this.node,{filter:a.url(e)})}d&&\"none\"!=d||(b.stop(),this.node.removeAttribute(\"filter\"))}),a.filter.blur=function(b,c){null==b&&(b=2);var d=null==c?b:[b,c];return a.format('<feGaussianBlur stdDeviation=\"{def}\"/>',{def:d})},a.filter.blur.toString=function(){return this()},a.filter.shadow=function(b,c,d,e,f){return null==f&&(null==e?(f=d,d=4,e=\"#000\"):(f=e,e=d,d=4)),null==d&&(d=4),null==f&&(f=1),null==b&&(b=0,c=2),null==c&&(c=b),e=a.color(e),a.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"{opacity}\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>',{color:e,dx:b,dy:c,blur:d,opacity:f})},a.filter.shadow.toString=function(){return this()},a.filter.grayscale=function(b){return null==b&&(b=1),a.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>',{a:.2126+.7874*(1-b),b:.7152-.7152*(1-b),c:.0722-.0722*(1-b),d:.2126-.2126*(1-b),e:.7152+.2848*(1-b),f:.0722-.0722*(1-b),g:.2126-.2126*(1-b),h:.0722+.9278*(1-b)})},a.filter.grayscale.toString=function(){return this()},a.filter.sepia=function(b){return null==b&&(b=1),a.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>',{a:.393+.607*(1-b),b:.769-.769*(1-b),c:.189-.189*(1-b),d:.349-.349*(1-b),e:.686+.314*(1-b),f:.168-.168*(1-b),g:.272-.272*(1-b),h:.534-.534*(1-b),i:.131+.869*(1-b)})},a.filter.sepia.toString=function(){return this()},a.filter.saturate=function(b){return null==b&&(b=1),a.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>',{amount:1-b})},a.filter.saturate.toString=function(){return this()},a.filter.hueRotate=function(b){return b=b||0,a.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>',{angle:b})},a.filter.hueRotate.toString=function(){return this()},a.filter.invert=function(b){return null==b&&(b=1),a.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>',{amount:b,amount2:1-b})},a.filter.invert.toString=function(){return this()},a.filter.brightness=function(b){return null==b&&(b=1),a.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>',{amount:b})},a.filter.brightness.toString=function(){return this()},a.filter.contrast=function(b){return null==b&&(b=1),a.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>',{amount:b,amount2:.5-b/2})},a.filter.contrast.toString=function(){return this()}}),d.plugin(function(a,b,c,d,e){var f=a._.box,g=a.is,h=/^[^a-z]*([tbmlrc])/i,i=function(){return\"T\"+this.dx+\",\"+this.dy};b.prototype.getAlign=function(a,b){null==b&&g(a,\"string\")&&(b=a,a=null),a=a||this.paper;var c=a.getBBox?a.getBBox():f(a),d=this.getBBox(),e={};switch(b=b&&b.match(h),b=b?b[1].toLowerCase():\"c\"){case\"t\":e.dx=0,e.dy=c.y-d.y;break;case\"b\":e.dx=0,e.dy=c.y2-d.y2;break;case\"m\":e.dx=0,e.dy=c.cy-d.cy;break;case\"l\":e.dx=c.x-d.x,e.dy=0;break;case\"r\":e.dx=c.x2-d.x2,e.dy=0;break;default:e.dx=c.cx-d.cx,e.dy=0}return e.toString=i,e},b.prototype.align=function(a,b){return this.transform(\"...\"+this.getAlign(a,b))}}),d.plugin(function(b,c,d,e){function f(a){a=a.split(/(?=#)/);var b=new String(a[5]);return b[50]=a[0],b[100]=a[1],b[200]=a[2],b[300]=a[3],b[400]=a[4],b[500]=a[5],b[600]=a[6],b[700]=a[7],b[800]=a[8],b[900]=a[9],a[10]&&(b.A100=a[10],b.A200=a[11],b.A400=a[12],b.A700=a[13]),b}var g=\"#ffebee#ffcdd2#ef9a9a#e57373#ef5350#f44336#e53935#d32f2f#c62828#b71c1c#ff8a80#ff5252#ff1744#d50000\",h=\"#FCE4EC#F8BBD0#F48FB1#F06292#EC407A#E91E63#D81B60#C2185B#AD1457#880E4F#FF80AB#FF4081#F50057#C51162\",i=\"#F3E5F5#E1BEE7#CE93D8#BA68C8#AB47BC#9C27B0#8E24AA#7B1FA2#6A1B9A#4A148C#EA80FC#E040FB#D500F9#AA00FF\",j=\"#EDE7F6#D1C4E9#B39DDB#9575CD#7E57C2#673AB7#5E35B1#512DA8#4527A0#311B92#B388FF#7C4DFF#651FFF#6200EA\",k=\"#E8EAF6#C5CAE9#9FA8DA#7986CB#5C6BC0#3F51B5#3949AB#303F9F#283593#1A237E#8C9EFF#536DFE#3D5AFE#304FFE\",l=\"#E3F2FD#BBDEFB#90CAF9#64B5F6#64B5F6#2196F3#1E88E5#1976D2#1565C0#0D47A1#82B1FF#448AFF#2979FF#2962FF\",m=\"#E1F5FE#B3E5FC#81D4FA#4FC3F7#29B6F6#03A9F4#039BE5#0288D1#0277BD#01579B#80D8FF#40C4FF#00B0FF#0091EA\",n=\"#E0F7FA#B2EBF2#80DEEA#4DD0E1#26C6DA#00BCD4#00ACC1#0097A7#00838F#006064#84FFFF#18FFFF#00E5FF#00B8D4\",o=\"#E0F2F1#B2DFDB#80CBC4#4DB6AC#26A69A#009688#00897B#00796B#00695C#004D40#A7FFEB#64FFDA#1DE9B6#00BFA5\",p=\"#E8F5E9#C8E6C9#A5D6A7#81C784#66BB6A#4CAF50#43A047#388E3C#2E7D32#1B5E20#B9F6CA#69F0AE#00E676#00C853\",q=\"#F1F8E9#DCEDC8#C5E1A5#AED581#9CCC65#8BC34A#7CB342#689F38#558B2F#33691E#CCFF90#B2FF59#76FF03#64DD17\",r=\"#F9FBE7#F0F4C3#E6EE9C#DCE775#D4E157#CDDC39#C0CA33#AFB42B#9E9D24#827717#F4FF81#EEFF41#C6FF00#AEEA00\",s=\"#FFFDE7#FFF9C4#FFF59D#FFF176#FFEE58#FFEB3B#FDD835#FBC02D#F9A825#F57F17#FFFF8D#FFFF00#FFEA00#FFD600\",t=\"#FFF8E1#FFECB3#FFE082#FFD54F#FFCA28#FFC107#FFB300#FFA000#FF8F00#FF6F00#FFE57F#FFD740#FFC400#FFAB00\",u=\"#FFF3E0#FFE0B2#FFCC80#FFB74D#FFA726#FF9800#FB8C00#F57C00#EF6C00#E65100#FFD180#FFAB40#FF9100#FF6D00\",v=\"#FBE9E7#FFCCBC#FFAB91#FF8A65#FF7043#FF5722#F4511E#E64A19#D84315#BF360C#FF9E80#FF6E40#FF3D00#DD2C00\",w=\"#EFEBE9#D7CCC8#BCAAA4#A1887F#8D6E63#795548#6D4C41#5D4037#4E342E#3E2723\",x=\"#FAFAFA#F5F5F5#EEEEEE#E0E0E0#BDBDBD#9E9E9E#757575#616161#424242#212121\",y=\"#ECEFF1#CFD8DC#B0BEC5#90A4AE#78909C#607D8B#546E7A#455A64#37474F#263238\";b.mui={},b.flat={},b.mui.red=f(g),b.mui.pink=f(h),b.mui.purple=f(i),b.mui.deeppurple=f(j),b.mui.indigo=f(k),b.mui.blue=f(l),b.mui.lightblue=f(m),b.mui.cyan=f(n),b.mui.teal=f(o),b.mui.green=f(p),b.mui.lightgreen=f(q),b.mui.lime=f(r),b.mui.yellow=f(s),b.mui.amber=f(t),b.mui.orange=f(u),b.mui.deeporange=f(v),b.mui.brown=f(w),b.mui.grey=f(x),b.mui.bluegrey=f(y),b.flat.turquoise=\"#1abc9c\",b.flat.greensea=\"#16a085\",b.flat.sunflower=\"#f1c40f\",b.flat.orange=\"#f39c12\",b.flat.emerland=\"#2ecc71\",b.flat.nephritis=\"#27ae60\",b.flat.carrot=\"#e67e22\",b.flat.pumpkin=\"#d35400\",b.flat.peterriver=\"#3498db\",b.flat.belizehole=\"#2980b9\",b.flat.alizarin=\"#e74c3c\",b.flat.pomegranate=\"#c0392b\",b.flat.amethyst=\"#9b59b6\",b.flat.wisteria=\"#8e44ad\",b.flat.clouds=\"#ecf0f1\",b.flat.silver=\"#bdc3c7\",b.flat.wetasphalt=\"#34495e\",b.flat.midnightblue=\"#2c3e50\",b.flat.concrete=\"#95a5a6\",b.flat.asbestos=\"#7f8c8d\",b.importMUIColors=function(){for(var c in b.mui)b.mui.hasOwnProperty(c)&&(a[c]=b.mui[c])}}),d});"
  },
  {
    "path": "dist/snap.svg.js",
    "content": "// Snap.svg 0.5.1\n//\n// Copyright (c) 2013 – 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// build: 2017-02-07\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ┌────────────────────────────────────────────────────────────┐ \\\\\n// │ Eve 0.5.0 - JavaScript Events Library                      │ \\\\\n// ├────────────────────────────────────────────────────────────┤ \\\\\n// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\\\\n// └────────────────────────────────────────────────────────────┘ \\\\\n\n(function (glob) {\n    var version = \"0.5.0\",\n        has = \"hasOwnProperty\",\n        separator = /[\\.\\/]/,\n        comaseparator = /\\s*,\\s*/,\n        wildcard = \"*\",\n        fun = function () {},\n        numsort = function (a, b) {\n            return a - b;\n        },\n        current_event,\n        stop,\n        events = {n: {}},\n        firstDefined = function () {\n            for (var i = 0, ii = this.length; i < ii; i++) {\n                if (typeof this[i] != \"undefined\") {\n                    return this[i];\n                }\n            }\n        },\n        lastDefined = function () {\n            var i = this.length;\n            while (--i) {\n                if (typeof this[i] != \"undefined\") {\n                    return this[i];\n                }\n            }\n        },\n        objtos = Object.prototype.toString,\n        Str = String,\n        isArray = Array.isArray || function (ar) {\n            return ar instanceof Array || objtos.call(ar) == \"[object Array]\";\n        };\n    /*\\\n     * eve\n     [ method ]\n\n     * Fires event with given `name`, given scope and other parameters.\n\n     > Arguments\n\n     - name (string) name of the *event*, dot (`.`) or slash (`/`) separated\n     - scope (object) context for the event handlers\n     - varargs (...) the rest of arguments will be sent to event handlers\n\n     = (object) array of returned values from the listeners. Array has two methods `.firstDefined()` and `.lastDefined()` to get first or last not `undefined` value.\n    \\*/\n        eve = function (name, scope) {\n            var e = events,\n                oldstop = stop,\n                args = Array.prototype.slice.call(arguments, 2),\n                listeners = eve.listeners(name),\n                z = 0,\n                f = false,\n                l,\n                indexed = [],\n                queue = {},\n                out = [],\n                ce = current_event,\n                errors = [];\n            out.firstDefined = firstDefined;\n            out.lastDefined = lastDefined;\n            current_event = name;\n            stop = 0;\n            for (var i = 0, ii = listeners.length; i < ii; i++) if (\"zIndex\" in listeners[i]) {\n                indexed.push(listeners[i].zIndex);\n                if (listeners[i].zIndex < 0) {\n                    queue[listeners[i].zIndex] = listeners[i];\n                }\n            }\n            indexed.sort(numsort);\n            while (indexed[z] < 0) {\n                l = queue[indexed[z++]];\n                out.push(l.apply(scope, args));\n                if (stop) {\n                    stop = oldstop;\n                    return out;\n                }\n            }\n            for (i = 0; i < ii; i++) {\n                l = listeners[i];\n                if (\"zIndex\" in l) {\n                    if (l.zIndex == indexed[z]) {\n                        out.push(l.apply(scope, args));\n                        if (stop) {\n                            break;\n                        }\n                        do {\n                            z++;\n                            l = queue[indexed[z]];\n                            l && out.push(l.apply(scope, args));\n                            if (stop) {\n                                break;\n                            }\n                        } while (l)\n                    } else {\n                        queue[l.zIndex] = l;\n                    }\n                } else {\n                    out.push(l.apply(scope, args));\n                    if (stop) {\n                        break;\n                    }\n                }\n            }\n            stop = oldstop;\n            current_event = ce;\n            return out;\n        };\n        // Undocumented. Debug only.\n        eve._events = events;\n    /*\\\n     * eve.listeners\n     [ method ]\n\n     * Internal method which gives you array of all event handlers that will be triggered by the given `name`.\n\n     > Arguments\n\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated\n\n     = (array) array of event handlers\n    \\*/\n    eve.listeners = function (name) {\n        var names = isArray(name) ? name : name.split(separator),\n            e = events,\n            item,\n            items,\n            k,\n            i,\n            ii,\n            j,\n            jj,\n            nes,\n            es = [e],\n            out = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            nes = [];\n            for (j = 0, jj = es.length; j < jj; j++) {\n                e = es[j].n;\n                items = [e[names[i]], e[wildcard]];\n                k = 2;\n                while (k--) {\n                    item = items[k];\n                    if (item) {\n                        nes.push(item);\n                        out = out.concat(item.f || []);\n                    }\n                }\n            }\n            es = nes;\n        }\n        return out;\n    };\n    /*\\\n     * eve.separator\n     [ method ]\n\n     * If for some reasons you don’t like default separators (`.` or `/`) you can specify yours\n     * here. Be aware that if you pass a string longer than one character it will be treated as\n     * a list of characters.\n\n     - separator (string) new separator. Empty string resets to default: `.` or `/`.\n    \\*/\n    eve.separator = function (sep) {\n        if (sep) {\n            sep = Str(sep).replace(/(?=[\\.\\^\\]\\[\\-])/g, \"\\\\\");\n            sep = \"[\" + sep + \"]\";\n            separator = new RegExp(sep);\n        } else {\n            separator = /[\\.\\/]/;\n        }\n    };\n    /*\\\n     * eve.on\n     [ method ]\n     **\n     * Binds given event handler with a given name. You can use wildcards “`*`” for the names:\n     | eve.on(\"*.under.*\", f);\n     | eve(\"mouse.under.floor\"); // triggers f\n     * Use @eve to trigger the listener.\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     - name (array) if you don’t want to use separators, you can use array of strings\n     - f (function) event handler function\n     **\n     = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. \n     > Example:\n     | eve.on(\"mouse\", eatIt)(2);\n     | eve.on(\"mouse\", scream);\n     | eve.on(\"mouse\", catchIt)(1);\n     * This will ensure that `catchIt` function will be called before `eatIt`.\n     *\n     * If you want to put your handler before non-indexed handlers, specify a negative value.\n     * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.\n    \\*/\n    eve.on = function (name, f) {\n        if (typeof f != \"function\") {\n            return function () {};\n        }\n        var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n        for (var i = 0, ii = names.length; i < ii; i++) {\n            (function (name) {\n                var names = isArray(name) ? name : Str(name).split(separator),\n                    e = events,\n                    exist;\n                for (var i = 0, ii = names.length; i < ii; i++) {\n                    e = e.n;\n                    e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}});\n                }\n                e.f = e.f || [];\n                for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {\n                    exist = true;\n                    break;\n                }\n                !exist && e.f.push(f);\n            }(names[i]));\n        }\n        return function (zIndex) {\n            if (+zIndex == +zIndex) {\n                f.zIndex = +zIndex;\n            }\n        };\n    };\n    /*\\\n     * eve.f\n     [ method ]\n     **\n     * Returns function that will fire given event with optional arguments.\n     * Arguments that will be passed to the result function will be also\n     * concated to the list of final arguments.\n     | el.onclick = eve.f(\"click\", 1, 2);\n     | eve.on(\"click\", function (a, b, c) {\n     |     console.log(a, b, c); // 1, 2, [event object]\n     | });\n     > Arguments\n     - event (string) event name\n     - varargs (…) and any other arguments\n     = (function) possible event handler function\n    \\*/\n    eve.f = function (event) {\n        var attrs = [].slice.call(arguments, 1);\n        return function () {\n            eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0)));\n        };\n    };\n    /*\\\n     * eve.stop\n     [ method ]\n     **\n     * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing.\n    \\*/\n    eve.stop = function () {\n        stop = 1;\n    };\n    /*\\\n     * eve.nt\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     > Arguments\n     **\n     - subname (string) #optional subname of the event\n     **\n     = (string) name of the event, if `subname` is not specified\n     * or\n     = (boolean) `true`, if current event’s name contains `subname`\n    \\*/\n    eve.nt = function (subname) {\n        var cur = isArray(current_event) ? current_event.join(\".\") : current_event;\n        if (subname) {\n            return new RegExp(\"(?:\\\\.|\\\\/|^)\" + subname + \"(?:\\\\.|\\\\/|$)\").test(cur);\n        }\n        return cur;\n    };\n    /*\\\n     * eve.nts\n     [ method ]\n     **\n     * Could be used inside event handler to figure out actual name of the event.\n     **\n     **\n     = (array) names of the event\n    \\*/\n    eve.nts = function () {\n        return isArray(current_event) ? current_event : current_event.split(separator);\n    };\n    /*\\\n     * eve.off\n     [ method ]\n     **\n     * Removes given function from the list of event listeners assigned to given name.\n     * If no arguments specified all the events will be cleared.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n    \\*/\n    /*\\\n     * eve.unbind\n     [ method ]\n     **\n     * See @eve.off\n    \\*/\n    eve.off = eve.unbind = function (name, f) {\n        if (!name) {\n            eve._events = events = {n: {}};\n            return;\n        }\n        var names = isArray(name) ? (isArray(name[0]) ? name : [name]) : Str(name).split(comaseparator);\n        if (names.length > 1) {\n            for (var i = 0, ii = names.length; i < ii; i++) {\n                eve.off(names[i], f);\n            }\n            return;\n        }\n        names = isArray(name) ? name : Str(name).split(separator);\n        var e,\n            key,\n            splice,\n            i, ii, j, jj,\n            cur = [events],\n            inodes = [];\n        for (i = 0, ii = names.length; i < ii; i++) {\n            for (j = 0; j < cur.length; j += splice.length - 2) {\n                splice = [j, 1];\n                e = cur[j].n;\n                if (names[i] != wildcard) {\n                    if (e[names[i]]) {\n                        splice.push(e[names[i]]);\n                        inodes.unshift({\n                            n: e,\n                            name: names[i]\n                        });\n                    }\n                } else {\n                    for (key in e) if (e[has](key)) {\n                        splice.push(e[key]);\n                        inodes.unshift({\n                            n: e,\n                            name: key\n                        });\n                    }\n                }\n                cur.splice.apply(cur, splice);\n            }\n        }\n        for (i = 0, ii = cur.length; i < ii; i++) {\n            e = cur[i];\n            while (e.n) {\n                if (f) {\n                    if (e.f) {\n                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {\n                            e.f.splice(j, 1);\n                            break;\n                        }\n                        !e.f.length && delete e.f;\n                    }\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        var funcs = e.n[key].f;\n                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {\n                            funcs.splice(j, 1);\n                            break;\n                        }\n                        !funcs.length && delete e.n[key].f;\n                    }\n                } else {\n                    delete e.f;\n                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {\n                        delete e.n[key].f;\n                    }\n                }\n                e = e.n;\n            }\n        }\n        // prune inner nodes in path\n        prune: for (i = 0, ii = inodes.length; i < ii; i++) {\n            e = inodes[i];\n            for (key in e.n[e.name].f) {\n                // not empty (has listeners)\n                continue prune;\n            }\n            for (key in e.n[e.name].n) {\n                // not empty (has children)\n                continue prune;\n            }\n            // is empty\n            delete e.n[e.name];\n        }\n    };\n    /*\\\n     * eve.once\n     [ method ]\n     **\n     * Binds given event handler with a given name to only run once then unbind itself.\n     | eve.once(\"login\", f);\n     | eve(\"login\"); // triggers f\n     | eve(\"login\"); // no listeners\n     * Use @eve to trigger the listener.\n     **\n     > Arguments\n     **\n     - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards\n     - f (function) event handler function\n     **\n     = (function) same return function as @eve.on\n    \\*/\n    eve.once = function (name, f) {\n        var f2 = function () {\n            eve.off(name, f2);\n            return f.apply(this, arguments);\n        };\n        return eve.on(name, f2);\n    };\n    /*\\\n     * eve.version\n     [ property (string) ]\n     **\n     * Current version of the library.\n    \\*/\n    eve.version = version;\n    eve.toString = function () {\n        return \"You are running Eve \" + version;\n    };\n    (typeof module != \"undefined\" && module.exports) ? (module.exports = eve) : (typeof define === \"function\" && define.amd ? (define(\"eve\", [], function() { return eve; })) : (glob.eve = eve));\n})(this);\n\n(function (glob, factory) {\n    // AMD support\n    if (typeof define == \"function\" && define.amd) {\n        // Define as an anonymous module\n        define([\"eve\"], function (eve) {\n            return factory(glob, eve);\n        });\n    } else if (typeof exports != \"undefined\") {\n        // Next for Node.js or CommonJS\n        var eve = require(\"eve\");\n        module.exports = factory(glob, eve);\n    } else {\n        // Browser globals (glob is window)\n        // Snap adds itself to window\n        factory(glob, glob.eve);\n    }\n}(window || this, function (window, eve) {\n\n// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n    var animations = {},\n    requestAnimFrame = window.requestAnimationFrame       ||\n                       window.webkitRequestAnimationFrame ||\n                       window.mozRequestAnimationFrame    ||\n                       window.oRequestAnimationFrame      ||\n                       window.msRequestAnimationFrame     ||\n                       function (callback) {\n                           setTimeout(callback, 16, new Date().getTime());\n                           return true;\n                       },\n    requestID,\n    isArray = Array.isArray || function (a) {\n        return a instanceof Array ||\n            Object.prototype.toString.call(a) == \"[object Array]\";\n    },\n    idgen = 0,\n    idprefix = \"M\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    diff = function (a, b, A, B) {\n        if (isArray(a)) {\n            res = [];\n            for (var i = 0, ii = a.length; i < ii; i++) {\n                res[i] = diff(a[i], b, A[i], B);\n            }\n            return res;\n        }\n        var dif = (A - a) / (B - b);\n        return function (bb) {\n            return a + dif * (bb - b);\n        };\n    },\n    timer = Date.now || function () {\n        return +new Date;\n    },\n    sta = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.s;\n        }\n        var ds = a.s - val;\n        a.b += a.dur * ds;\n        a.B += a.dur * ds;\n        a.s = val;\n    },\n    speed = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.spd;\n        }\n        a.spd = val;\n    },\n    duration = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.dur;\n        }\n        a.s = a.s * val / a.dur;\n        a.dur = val;\n    },\n    stopit = function () {\n        var a = this;\n        delete animations[a.id];\n        a.update();\n        eve(\"mina.stop.\" + a.id, a);\n    },\n    pause = function () {\n        var a = this;\n        if (a.pdif) {\n            return;\n        }\n        delete animations[a.id];\n        a.update();\n        a.pdif = a.get() - a.b;\n    },\n    resume = function () {\n        var a = this;\n        if (!a.pdif) {\n            return;\n        }\n        a.b = a.get() - a.pdif;\n        delete a.pdif;\n        animations[a.id] = a;\n        frame();\n    },\n    update = function () {\n        var a = this,\n            res;\n        if (isArray(a.start)) {\n            res = [];\n            for (var j = 0, jj = a.start.length; j < jj; j++) {\n                res[j] = +a.start[j] +\n                    (a.end[j] - a.start[j]) * a.easing(a.s);\n            }\n        } else {\n            res = +a.start + (a.end - a.start) * a.easing(a.s);\n        }\n        a.set(res);\n    },\n    frame = function (timeStamp) {\n        // Manual invokation?\n        if (!timeStamp) {\n            // Frame loop stopped?\n            if (!requestID) {\n                // Start frame loop...\n                requestID = requestAnimFrame(frame);\n            }\n            return;\n        }\n        var len = 0;\n        for (var i in animations) if (animations.hasOwnProperty(i)) {\n            var a = animations[i],\n                b = a.get(),\n                res;\n            len++;\n            a.s = (b - a.b) / (a.dur / a.spd);\n            if (a.s >= 1) {\n                delete animations[i];\n                a.s = 1;\n                len--;\n                (function (a) {\n                    setTimeout(function () {\n                        eve(\"mina.finish.\" + a.id, a);\n                    });\n                }(a));\n            }\n            a.update();\n        }\n        requestID = len ? requestAnimFrame(frame) : false;\n    },\n    /*\\\n     * mina\n     [ method ]\n     **\n     * Generic animation of numbers\n     **\n     - a (number) start _slave_ number\n     - A (number) end _slave_ number\n     - b (number) start _master_ number (start time in general case)\n     - B (number) end _master_ number (end time in general case)\n     - get (function) getter of _master_ number (see @mina.time)\n     - set (function) setter of _slave_ number\n     - easing (function) #optional easing function, default is @mina.linear\n     = (object) animation descriptor\n     o {\n     o         id (string) animation id,\n     o         start (number) start _slave_ number,\n     o         end (number) end _slave_ number,\n     o         b (number) start _master_ number,\n     o         s (number) animation status (0..1),\n     o         dur (number) animation duration,\n     o         spd (number) animation speed,\n     o         get (function) getter of _master_ number (see @mina.time),\n     o         set (function) setter of _slave_ number,\n     o         easing (function) easing function, default is @mina.linear,\n     o         status (function) status getter/setter,\n     o         speed (function) speed getter/setter,\n     o         duration (function) duration getter/setter,\n     o         stop (function) animation stopper\n     o         pause (function) pauses the animation\n     o         resume (function) resumes the animation\n     o         update (function) calles setter with the right value of the animation\n     o }\n    \\*/\n    mina = function (a, A, b, B, get, set, easing) {\n        var anim = {\n            id: ID(),\n            start: a,\n            end: A,\n            b: b,\n            s: 0,\n            dur: B - b,\n            spd: 1,\n            get: get,\n            set: set,\n            easing: easing || mina.linear,\n            status: sta,\n            speed: speed,\n            duration: duration,\n            stop: stopit,\n            pause: pause,\n            resume: resume,\n            update: update\n        };\n        animations[anim.id] = anim;\n        var len = 0, i;\n        for (i in animations) if (animations.hasOwnProperty(i)) {\n            len++;\n            if (len == 2) {\n                break;\n            }\n        }\n        len == 1 && frame();\n        return anim;\n    };\n    /*\\\n     * mina.time\n     [ method ]\n     **\n     * Returns the current time. Equivalent to:\n     | function () {\n     |     return (new Date).getTime();\n     | }\n    \\*/\n    mina.time = timer;\n    /*\\\n     * mina.getById\n     [ method ]\n     **\n     * Returns an animation by its id\n     - id (string) animation's id\n     = (object) See @mina\n    \\*/\n    mina.getById = function (id) {\n        return animations[id] || null;\n    };\n\n    /*\\\n     * mina.linear\n     [ method ]\n     **\n     * Default linear easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.linear = function (n) {\n        return n;\n    };\n    /*\\\n     * mina.easeout\n     [ method ]\n     **\n     * Easeout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeout = function (n) {\n        return Math.pow(n, 1.7);\n    };\n    /*\\\n     * mina.easein\n     [ method ]\n     **\n     * Easein easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easein = function (n) {\n        return Math.pow(n, .48);\n    };\n    /*\\\n     * mina.easeinout\n     [ method ]\n     **\n     * Easeinout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeinout = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        if (n == 0) {\n            return 0;\n        }\n        var q = .48 - n / 1.04,\n            Q = Math.sqrt(.1734 + q * q),\n            x = Q - q,\n            X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n            y = -Q - q,\n            Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n            t = X + Y + .5;\n        return (1 - t) * 3 * t * t + t * t * t;\n    };\n    /*\\\n     * mina.backin\n     [ method ]\n     **\n     * Backin easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backin = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        var s = 1.70158;\n        return n * n * ((s + 1) * n - s);\n    };\n    /*\\\n     * mina.backout\n     [ method ]\n     **\n     * Backout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backout = function (n) {\n        if (n == 0) {\n            return 0;\n        }\n        n = n - 1;\n        var s = 1.70158;\n        return n * n * ((s + 1) * n + s) + 1;\n    };\n    /*\\\n     * mina.elastic\n     [ method ]\n     **\n     * Elastic easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.elastic = function (n) {\n        if (n == !!n) {\n            return n;\n        }\n        return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n            (2 * Math.PI) / .3) + 1;\n    };\n    /*\\\n     * mina.bounce\n     [ method ]\n     **\n     * Bounce easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.bounce = function (n) {\n        var s = 7.5625,\n            p = 2.75,\n            l;\n        if (n < 1 / p) {\n            l = s * n * n;\n        } else {\n            if (n < 2 / p) {\n                n -= 1.5 / p;\n                l = s * n * n + .75;\n            } else {\n                if (n < 2.5 / p) {\n                    n -= 2.25 / p;\n                    l = s * n * n + .9375;\n                } else {\n                    n -= 2.625 / p;\n                    l = s * n * n + .984375;\n                }\n            }\n        }\n        return l;\n    };\n    window.mina = mina;\n    return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n\n// Copyright (c) 2013 - 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function(root) {\nSnap.version = \"0.5.1\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - array (array) array of elements (will return set of elements)\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n    if (w) {\n        if (w.nodeType) {\n            return wrap(w);\n        }\n        if (is(w, \"array\") && Snap.set) {\n            return Snap.set.apply(Snap, w);\n        }\n        if (w instanceof Element) {\n            return w;\n        }\n        if (h == null) {\n            try {\n                w = glob.doc.querySelector(String(w));\n                return wrap(w);\n            } catch (e) {\n                return null;\n            }\n        }\n    }\n    w = w == null ? \"100%\" : w;\n    h = h == null ? \"100%\" : h;\n    return new Paper(w, h);\n}\nSnap.toString = function () {\n    return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n    win: root.window,\n    doc: root.window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n    Str = String,\n    toFloat = parseFloat,\n    toInt = parseInt,\n    math = Math,\n    mmax = math.max,\n    mmin = math.min,\n    abs = math.abs,\n    pow = math.pow,\n    PI = math.PI,\n    round = math.round,\n    E = \"\",\n    S = \" \",\n    objectToString = Object.prototype.toString,\n    ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n    colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n    bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n    separator = Snap._.separator = /[,\\s]+/,\n    whitespace = /[\\s]/g,\n    commaSpaces = /[\\s]*,[\\s]*/,\n    hsrg = {hs: 1, rg: 1},\n    pathCommand = /([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n    tCommand = /([rstm])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n    pathValues = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\s]*,?[\\s]*/ig,\n    idgen = 0,\n    idprefix = \"S\" + (+new Date).toString(36),\n    ID = function (el) {\n        return (el && el.type ? el.type : E) + idprefix + (idgen++).toString(36);\n    },\n    xlink = \"http://www.w3.org/1999/xlink\",\n    xmlns = \"http://www.w3.org/2000/svg\",\n    hub = {},\n    /*\\\n     * Snap.url\n     [ method ]\n     **\n     * Wraps path into `\"url('<path>')\"`.\n     - value (string) path\n     = (string) wrapped path\n    \\*/\n    URL = Snap.url = function (url) {\n        return \"url('#\" + url + \"')\";\n    };\n\nfunction $(el, attr) {\n    if (attr) {\n        if (el == \"#text\") {\n            el = glob.doc.createTextNode(attr.text || attr[\"#text\"] || \"\");\n        }\n        if (el == \"#comment\") {\n            el = glob.doc.createComment(attr.text || attr[\"#text\"] || \"\");\n        }\n        if (typeof el == \"string\") {\n            el = $(el);\n        }\n        if (typeof attr == \"string\") {\n            if (el.nodeType == 1) {\n                if (attr.substring(0, 6) == \"xlink:\") {\n                    return el.getAttributeNS(xlink, attr.substring(6));\n                }\n                if (attr.substring(0, 4) == \"xml:\") {\n                    return el.getAttributeNS(xmlns, attr.substring(4));\n                }\n                return el.getAttribute(attr);\n            } else if (attr == \"text\") {\n                return el.nodeValue;\n            } else {\n                return null;\n            }\n        }\n        if (el.nodeType == 1) {\n            for (var key in attr) if (attr[has](key)) {\n                var val = Str(attr[key]);\n                if (val) {\n                    if (key.substring(0, 6) == \"xlink:\") {\n                        el.setAttributeNS(xlink, key.substring(6), val);\n                    } else if (key.substring(0, 4) == \"xml:\") {\n                        el.setAttributeNS(xmlns, key.substring(4), val);\n                    } else {\n                        el.setAttribute(key, val);\n                    }\n                } else {\n                    el.removeAttribute(key);\n                }\n            }\n        } else if (\"text\" in attr) {\n            el.nodeValue = attr.text;\n        }\n    } else {\n        el = glob.doc.createElementNS(xmlns, el);\n    }\n    return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n    var attrs = el.attributes,\n        name,\n        out = {};\n    for (var i = 0; i < attrs.length; i++) {\n        if (attrs[i].namespaceURI == xlink) {\n            name = \"xlink:\";\n        } else {\n            name = \"\";\n        }\n        name += attrs[i].name;\n        out[name] = attrs[i].textContent;\n    }\n    return out;\n}\nfunction is(o, type) {\n    type = Str.prototype.toLowerCase.call(type);\n    if (type == \"finite\") {\n        return isFinite(o);\n    }\n    if (type == \"array\" &&\n        (o instanceof Array || Array.isArray && Array.isArray(o))) {\n        return true;\n    }\n    return  type == \"null\" && o === null ||\n            type == typeof o && o !== null ||\n            type == \"object\" && o === Object(o) ||\n            objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{<name>}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n |     x: 10,\n |     y: 20,\n |     dim: {\n |         width: 40,\n |         height: 50,\n |         \"negative width\": -40\n |     }\n | }));\n\\*/\nSnap.format = (function () {\n    var tokenRegex = /\\{([^\\}]+)\\}/g,\n        objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n        replacer = function (all, key, obj) {\n            var res = obj;\n            key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                name = name || quotedName;\n                if (res) {\n                    if (name in res) {\n                        res = res[name];\n                    }\n                    typeof res == \"function\" && isFunc && (res = res());\n                }\n            });\n            res = (res == null || res == obj ? all : res) + \"\";\n            return res;\n        };\n    return function (str, obj) {\n        return Str(str).replace(tokenRegex, function (all, key) {\n            return replacer(all, key, obj);\n        });\n    };\n})();\nfunction clone(obj) {\n    if (typeof obj == \"function\" || Object(obj) !== obj) {\n        return obj;\n    }\n    var res = new obj.constructor;\n    for (var key in obj) if (obj[has](key)) {\n        res[key] = clone(obj[key]);\n    }\n    return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n        return array.push(array.splice(i, 1)[0]);\n    }\n}\nfunction cacher(f, scope, postprocessor) {\n    function newf() {\n        var arg = Array.prototype.slice.call(arguments, 0),\n            args = arg.join(\"\\u2400\"),\n            cache = newf.cache = newf.cache || {},\n            count = newf.count = newf.count || [];\n        if (cache[has](args)) {\n            repush(count, args);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        count.length >= 1e3 && delete cache[count.shift()];\n        count.push(args);\n        cache[args] = f.apply(scope, arg);\n        return postprocessor ? postprocessor(cache[args]) : cache[args];\n    }\n    return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n    if (x3 == null) {\n        var x = x1 - x2,\n            y = y1 - y2;\n        if (!x && !y) {\n            return 0;\n        }\n        return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n    } else {\n        return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n    }\n}\nfunction rad(deg) {\n    return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n    return rad * 180 / PI % 360;\n}\nfunction x_y() {\n    return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n    return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n/*\\\n * Snap.sin\n [ method ]\n **\n * Equivalent to `Math.sin()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) sin\n\\*/\nSnap.sin = function (angle) {\n    return math.sin(Snap.rad(angle));\n};\n/*\\\n * Snap.tan\n [ method ]\n **\n * Equivalent to `Math.tan()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) tan\n\\*/\nSnap.tan = function (angle) {\n    return math.tan(Snap.rad(angle));\n};\n/*\\\n * Snap.cos\n [ method ]\n **\n * Equivalent to `Math.cos()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) cos\n\\*/\nSnap.cos = function (angle) {\n    return math.cos(Snap.rad(angle));\n};\n/*\\\n * Snap.asin\n [ method ]\n **\n * Equivalent to `Math.asin()` only works with degrees, not radians.\n - num (number) value\n = (number) asin in degrees\n\\*/\nSnap.asin = function (num) {\n    return Snap.deg(math.asin(num));\n};\n/*\\\n * Snap.acos\n [ method ]\n **\n * Equivalent to `Math.acos()` only works with degrees, not radians.\n - num (number) value\n = (number) acos in degrees\n\\*/\nSnap.acos = function (num) {\n    return Snap.deg(math.acos(num));\n};\n/*\\\n * Snap.atan\n [ method ]\n **\n * Equivalent to `Math.atan()` only works with degrees, not radians.\n - num (number) value\n = (number) atan in degrees\n\\*/\nSnap.atan = function (num) {\n    return Snap.deg(math.atan(num));\n};\n/*\\\n * Snap.atan2\n [ method ]\n **\n * Equivalent to `Math.atan2()` only works with degrees, not radians.\n - num (number) value\n = (number) atan2 in degrees\n\\*/\nSnap.atan2 = function (num) {\n    return Snap.deg(math.atan2(num));\n};\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.len\n [ method ]\n **\n * Returns distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len = function (x1, y1, x2, y2) {\n    return Math.sqrt(Snap.len2(x1, y1, x2, y2));\n};\n/*\\\n * Snap.len2\n [ method ]\n **\n * Returns squared distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len2 = function (x1, y1, x2, y2) {\n    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n};\n/*\\\n * Snap.closestPoint\n [ method ]\n **\n * Returns closest point to a given one on a given path.\n - path (Element) path element\n - x (number) x coord of a point\n - y (number) y coord of a point\n = (object) in format\n {\n    x (number) x coord of the point on the path\n    y (number) y coord of the point on the path\n    length (number) length of the path to the point\n    distance (number) distance from the given point to the path\n }\n\\*/\n// Copied from http://bl.ocks.org/mbostock/8027637\nSnap.closestPoint = function (path, x, y) {\n    function distance2(p) {\n        var dx = p.x - x,\n            dy = p.y - y;\n        return dx * dx + dy * dy;\n    }\n    var pathNode = path.node,\n        pathLength = pathNode.getTotalLength(),\n        precision = pathLength / pathNode.pathSegList.numberOfItems * .125,\n        best,\n        bestLength,\n        bestDistance = Infinity;\n\n    // linear scan for coarse approximation\n    for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {\n        if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {\n            best = scan;\n            bestLength = scanLength;\n            bestDistance = scanDistance;\n        }\n    }\n\n    // binary search for precise estimate\n    precision *= .5;\n    while (precision > .5) {\n        var before,\n            after,\n            beforeLength,\n            afterLength,\n            beforeDistance,\n            afterDistance;\n        if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {\n            best = before;\n            bestLength = beforeLength;\n            bestDistance = beforeDistance;\n        } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {\n            best = after;\n            bestLength = afterLength;\n            bestDistance = afterDistance;\n        } else {\n            precision *= .5;\n        }\n    }\n\n    best = {\n        x: best.x,\n        y: best.y,\n        length: bestLength,\n        distance: Math.sqrt(bestDistance)\n    };\n    return best;\n}\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n    tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n    if (is(values, \"array\")) {\n        var i = values.length;\n        while (i--) if (abs(values[i] - value) <= tolerance) {\n            return values[i];\n        }\n    } else {\n        values = +values;\n        var rem = value % values;\n        if (rem < tolerance) {\n            return value - rem;\n        }\n        if (rem > values - tolerance) {\n            return value - rem + values;\n        }\n    }\n    return value;\n};\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n # <ul>\n #     <li>Color name (<code>red</code>, <code>green</code>, <code>cornflowerblue</code>, etc)</li>\n #     <li>#••• — shortened HTML color: (<code>#000</code>, <code>#fc0</code>, etc.)</li>\n #     <li>#•••••• — full length HTML color: (<code>#000000</code>, <code>#bd2300</code>)</li>\n #     <li>rgb(•••, •••, •••) — red, green and blue channels values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n #     <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n #     <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n #     <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsl(•••, •••, •••) — hue, saturation and luminosity values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n #     <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n # </ul>\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n    if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    if (colour == \"none\") {\n        return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n    }\n    !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n    if (!colour) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    var res,\n        red,\n        green,\n        blue,\n        opacity,\n        t,\n        values,\n        rgb = colour.match(colourRegExp);\n    if (rgb) {\n        if (rgb[2]) {\n            blue = toInt(rgb[2].substring(5), 16);\n            green = toInt(rgb[2].substring(3, 5), 16);\n            red = toInt(rgb[2].substring(1, 3), 16);\n        }\n        if (rgb[3]) {\n            blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n            green = toInt((t = rgb[3].charAt(2)) + t, 16);\n            red = toInt((t = rgb[3].charAt(1)) + t, 16);\n        }\n        if (rgb[4]) {\n            values = rgb[4].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red *= 2.55);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green *= 2.55);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue *= 2.55);\n            rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n        }\n        if (rgb[5]) {\n            values = rgb[5].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsb2rgb(red, green, blue, opacity);\n        }\n        if (rgb[6]) {\n            values = rgb[6].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsl2rgb(red, green, blue, opacity);\n        }\n        red = mmin(math.round(red), 255);\n        green = mmin(math.round(green), 255);\n        blue = mmin(math.round(blue), 255);\n        opacity = mmin(mmax(opacity, 0), 1);\n        rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n        rgb.hex = \"#\" + (16777216 | blue | green << 8 | red << 16).toString(16).slice(1);\n        rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n        return rgb;\n    }\n    return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n    return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n    return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n    if (is(o, \"finite\")) {\n        var round = math.round;\n        return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n    }\n    return \"#\" + (16777216 | b | g << 8 | r << 16).toString(16).slice(1);\n});\nvar toHex = function (color) {\n    var i = glob.doc.getElementsByTagName(\"head\")[0] || glob.doc.getElementsByTagName(\"svg\")[0],\n        red = \"rgb(255, 0, 0)\";\n    toHex = cacher(function (color) {\n        if (color.toLowerCase() == \"red\") {\n            return red;\n        }\n        i.style.color = red;\n        i.style.color = color;\n        var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n        return out == red ? null : out;\n    });\n    return toHex(color);\n},\nhsbtoString = function () {\n    return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n    return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n    return this.opacity == 1 || this.opacity == null ?\n            this.hex :\n            \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n    if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n        b = r.b;\n        g = r.g;\n        r = r.r;\n    }\n    if (g == null && is(r, string)) {\n        var clr = Snap.getRGB(r);\n        r = clr.r;\n        g = clr.g;\n        b = clr.b;\n    }\n    if (r > 1 || g > 1 || b > 1) {\n        r /= 255;\n        g /= 255;\n        b /= 255;\n    }\n\n    return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n    r = math.round(r * 255);\n    g = math.round(g * 255);\n    b = math.round(b * 255);\n    var rgb = {\n        r: r,\n        g: g,\n        b: b,\n        opacity: is(o, \"finite\") ? o : 1,\n        hex: Snap.rgb(r, g, b),\n        toString: rgbtoString\n    };\n    is(o, \"finite\") && (rgb.opacity = o);\n    return rgb;\n};\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) `true` if string can't be parsed,\n o     h (number) hue,\n o     s (number) saturation,\n o     v (number) value (brightness),\n o     l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n    var rgb;\n    if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n        rgb = Snap.hsb2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n        rgb = Snap.hsl2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else {\n        if (is(clr, \"string\")) {\n            clr = Snap.getRGB(clr);\n        }\n        if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n            rgb = Snap.rgb2hsl(clr);\n            clr.h = rgb.h;\n            clr.s = rgb.s;\n            clr.l = rgb.l;\n            rgb = Snap.rgb2hsb(clr);\n            clr.v = rgb.b;\n        } else {\n            clr = {hex: \"none\"};\n            clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            clr.error = 1;\n        }\n    }\n    clr.toString = rgbtoString;\n    return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n        v = h.b;\n        s = h.s;\n        o = h.o;\n        h = h.h;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = h % 360 / 60;\n    C = v * s;\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = v - C;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n        l = h.l;\n        s = h.s;\n        h = h.h;\n    }\n    if (h > 1 || s > 1 || l > 1) {\n        h /= 360;\n        s /= 100;\n        l /= 100;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = h % 360 / 60;\n    C = 2 * s * (l < .5 ? l : 1 - l);\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = l - C / 2;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, V, C;\n    V = mmax(r, g, b);\n    C = V - mmin(r, g, b);\n    H = C == 0 ? null :\n        V == r ? (g - b) / C :\n        V == g ? (b - r) / C + 2 :\n                 (r - g) / C + 4;\n    H = (H + 360) % 6 * 60 / 360;\n    S = C == 0 ? 0 : C / V;\n    return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, L, M, m, C;\n    M = mmax(r, g, b);\n    m = mmin(r, g, b);\n    C = M - m;\n    H = C == 0 ? null :\n        M == r ? (g - b) / C :\n        M == g ? (b - r) / C + 2 :\n                 (r - g) / C + 4;\n    H = (H + 360) % 6 * 60 / 360;\n    L = (M + m) / 2;\n    S = C == 0 ? 0 :\n         L < .5 ? C / (2 * L) :\n                  C / (2 - 2 * L);\n    return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n    if (!pathString) {\n        return null;\n    }\n    var pth = Snap.path(pathString);\n    if (pth.arr) {\n        return Snap.path.clone(pth.arr);\n    }\n\n    var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n        data = [];\n    if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(pathString);\n    }\n    if (!data.length) {\n        Str(pathString).replace(pathCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            if (name == \"m\" && params.length > 2) {\n                data.push([b].concat(params.splice(0, 2)));\n                name = \"l\";\n                b = b == \"m\" ? \"l\" : \"L\";\n            }\n            if (name == \"o\" && params.length == 1) {\n                data.push([b, params[0]]);\n            }\n            if (name == \"r\") {\n                data.push([b].concat(params));\n            } else while (params.length >= paramCounts[name]) {\n                data.push([b].concat(params.splice(0, paramCounts[name])));\n                if (!paramCounts[name]) {\n                    break;\n                }\n            }\n        });\n    }\n    data.toString = Snap.path.toString;\n    pth.arr = Snap.path.clone(data);\n    return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n    if (!TString) {\n        return null;\n    }\n    var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n        data = [];\n    if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(TString);\n    }\n    if (!data.length) {\n        Str(TString).replace(tCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            data.push([b].concat(params));\n        });\n    }\n    data.toString = Snap.path.toString;\n    return data;\n};\nfunction svgTransform2string(tstr) {\n    var res = [];\n    tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n        params = params.split(/\\s*,\\s*|\\s+/);\n        if (name == \"rotate\" && params.length == 1) {\n            params.push(0, 0);\n        }\n        if (name == \"scale\") {\n            if (params.length > 2) {\n                params = params.slice(0, 2);\n            } else if (params.length == 2) {\n                params.push(0, 0);\n            }\n            if (params.length == 1) {\n                params.push(params[0], 0, 0);\n            }\n        }\n        if (name == \"skewX\") {\n            res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n        } else if (name == \"skewY\") {\n            res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n        } else {\n            res.push([name.charAt(0)].concat(params));\n        }\n        return all;\n    });\n    return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = /^[a-z][\\s]*-?\\.?\\d/i;\nfunction transform2matrix(tstr, bbox) {\n    var tdata = parseTransformString(tstr),\n        m = new Snap.Matrix;\n    if (tdata) {\n        for (var i = 0, ii = tdata.length; i < ii; i++) {\n            var t = tdata[i],\n                tlen = t.length,\n                command = Str(t[0]).toLowerCase(),\n                absolute = t[0] != command,\n                inver = absolute ? m.invert() : 0,\n                x1,\n                y1,\n                x2,\n                y2,\n                bb;\n            if (command == \"t\" && tlen == 2){\n                m.translate(t[1], 0);\n            } else if (command == \"t\" && tlen == 3) {\n                if (absolute) {\n                    x1 = inver.x(0, 0);\n                    y1 = inver.y(0, 0);\n                    x2 = inver.x(t[1], t[2]);\n                    y2 = inver.y(t[1], t[2]);\n                    m.translate(x2 - x1, y2 - y1);\n                } else {\n                    m.translate(t[1], t[2]);\n                }\n            } else if (command == \"r\") {\n                if (tlen == 2) {\n                    bb = bb || bbox;\n                    m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.rotate(t[1], x2, y2);\n                    } else {\n                        m.rotate(t[1], t[2], t[3]);\n                    }\n                }\n            } else if (command == \"s\") {\n                if (tlen == 2 || tlen == 3) {\n                    bb = bb || bbox;\n                    m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.scale(t[1], t[1], x2, y2);\n                    } else {\n                        m.scale(t[1], t[1], t[2], t[3]);\n                    }\n                } else if (tlen == 5) {\n                    if (absolute) {\n                        x2 = inver.x(t[3], t[4]);\n                        y2 = inver.y(t[3], t[4]);\n                        m.scale(t[1], t[2], x2, y2);\n                    } else {\n                        m.scale(t[1], t[2], t[3], t[4]);\n                    }\n                }\n            } else if (command == \"m\" && tlen == 7) {\n                m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n            }\n        }\n    }\n    return m;\n}\nSnap._.transform2matrix = transform2matrix;\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n    function (a, b) {\n        var adown = a.nodeType == 9 ? a.documentElement : a,\n            bup = b && b.parentNode;\n            return a == bup || !!(bup && bup.nodeType == 1 && (\n                adown.contains ?\n                    adown.contains(bup) :\n                    a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n            ));\n    } :\n    function (a, b) {\n        if (b) {\n            while (b) {\n                b = b.parentNode;\n                if (b == a) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\nfunction getSomeDefs(el) {\n    var p = el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) ||\n            el.node.parentNode && wrap(el.node.parentNode) ||\n            Snap.select(\"svg\") ||\n            Snap(0, 0),\n        pdefs = p.select(\"defs\"),\n        defs  = pdefs == null ? false : pdefs.node;\n    if (!defs) {\n        defs = make(\"defs\", p.node).node;\n    }\n    return defs;\n}\nfunction getSomeSVG(el) {\n    return el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) || Snap.select(\"svg\");\n}\nSnap._.getSomeDefs = getSomeDefs;\nSnap._.getSomeSVG = getSomeSVG;\nfunction unit2px(el, name, value) {\n    var svg = getSomeSVG(el).node,\n        out = {},\n        mgr = svg.querySelector(\".svg---mgr\");\n    if (!mgr) {\n        mgr = $(\"rect\");\n        $(mgr, {x: -9e9, y: -9e9, width: 10, height: 10, \"class\": \"svg---mgr\", fill: \"none\"});\n        svg.appendChild(mgr);\n    }\n    function getW(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {width: val});\n        try {\n            return mgr.getBBox().width;\n        } catch (e) {\n            return 0;\n        }\n    }\n    function getH(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {height: val});\n        try {\n            return mgr.getBBox().height;\n        } catch (e) {\n            return 0;\n        }\n    }\n    function set(nam, f) {\n        if (name == null) {\n            out[nam] = f(el.attr(nam) || 0);\n        } else if (nam == name) {\n            out = f(value == null ? el.attr(nam) || 0 : value);\n        }\n    }\n    switch (el.type) {\n        case \"rect\":\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        case \"image\":\n            set(\"width\", getW);\n            set(\"height\", getH);\n        case \"text\":\n            set(\"x\", getW);\n            set(\"y\", getH);\n        break;\n        case \"circle\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"r\", getW);\n        break;\n        case \"ellipse\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        break;\n        case \"line\":\n            set(\"x1\", getW);\n            set(\"x2\", getW);\n            set(\"y1\", getH);\n            set(\"y2\", getH);\n        break;\n        case \"marker\":\n            set(\"refX\", getW);\n            set(\"markerWidth\", getW);\n            set(\"refY\", getH);\n            set(\"markerHeight\", getH);\n        break;\n        case \"radialGradient\":\n            set(\"fx\", getW);\n            set(\"fy\", getH);\n        break;\n        case \"tspan\":\n            set(\"dx\", getW);\n            set(\"dy\", getH);\n        break;\n        default:\n            set(name, getW);\n    }\n    svg.removeChild(mgr);\n    return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n    query = Str(query).replace(/([^\\\\]):/g, \"$1\\\\:\");\n    return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n    var nodelist = glob.doc.querySelectorAll(query),\n        set = (Snap.set || Array)();\n    for (var i = 0; i < nodelist.length; i++) {\n        set.push(wrap(nodelist[i]));\n    }\n    return set;\n};\n\nfunction add2group(list) {\n    if (!is(list, \"array\")) {\n        list = Array.prototype.slice.call(arguments, 0);\n    }\n    var i = 0,\n        j = 0,\n        node = this.node;\n    while (this[i]) delete this[i++];\n    for (i = 0; i < list.length; i++) {\n        if (list[i].type == \"set\") {\n            list[i].forEach(function (el) {\n                node.appendChild(el.node);\n            });\n        } else {\n            node.appendChild(list[i].node);\n        }\n    }\n    var children = node.childNodes;\n    for (i = 0; i < children.length; i++) {\n        this[j++] = wrap(children[i]);\n    }\n    return this;\n}\n// Hub garbage collector every 10s\nsetInterval(function () {\n    for (var key in hub) if (hub[has](key)) {\n        var el = hub[key],\n            node = el.node;\n        if (el.type != \"svg\" && !node.ownerSVGElement || el.type == \"svg\" && (!node.parentNode || \"ownerSVGElement\" in node.parentNode && !node.ownerSVGElement)) {\n            delete hub[key];\n        }\n    }\n}, 1e4);\nfunction Element(el) {\n    if (el.snap in hub) {\n        return hub[el.snap];\n    }\n    var svg;\n    try {\n        svg = el.ownerSVGElement;\n    } catch(e) {}\n    /*\\\n     * Element.node\n     [ property (object) ]\n     **\n     * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\n     > Usage\n     | // draw a circle at coordinate 10,10 with radius of 10\n     | var c = paper.circle(10, 10, 10);\n     | c.node.onclick = function () {\n     |     c.attr(\"fill\", \"red\");\n     | };\n    \\*/\n    this.node = el;\n    if (svg) {\n        this.paper = new Paper(svg);\n    }\n    /*\\\n     * Element.type\n     [ property (string) ]\n     **\n     * SVG tag name of the given element.\n    \\*/\n    this.type = el.tagName || el.nodeName;\n    var id = this.id = ID(this);\n    this.anims = {};\n    this._ = {\n        transform: []\n    };\n    el.snap = id;\n    hub[id] = this;\n    if (this.type == \"g\") {\n        this.add = add2group;\n    }\n    if (this.type in {g: 1, mask: 1, pattern: 1, symbol: 1}) {\n        for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n            this[method] = Paper.prototype[method];\n        }\n    }\n}\n   /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Gets or sets given attributes of the element.\n     **\n     - params (object) contains key-value pairs of attributes you want to set\n     * or\n     - param (string) name of the attribute\n     = (Element) the current element\n     * or\n     = (string) value of attribute\n     > Usage\n     | el.attr({\n     |     fill: \"#fc0\",\n     |     stroke: \"#000\",\n     |     strokeWidth: 2, // CamelCase...\n     |     \"fill-opacity\": 0.5, // or dash-separated names\n     |     width: \"*=2\" // prefixed values\n     | });\n     | console.log(el.attr(\"fill\")); // #fc0\n     * Prefixed values in format `\"+=10\"` supported. All four operations\n     * (`+`, `-`, `*` and `/`) could be used. Optionally you can use units for `+`\n     * and `-`: `\"+=2em\"`.\n    \\*/\n    Element.prototype.attr = function (params, value) {\n        var el = this,\n            node = el.node;\n        if (!params) {\n            if (node.nodeType != 1) {\n                return {\n                    text: node.nodeValue\n                };\n            }\n            var attr = node.attributes,\n                out = {};\n            for (var i = 0, ii = attr.length; i < ii; i++) {\n                out[attr[i].nodeName] = attr[i].nodeValue;\n            }\n            return out;\n        }\n        if (is(params, \"string\")) {\n            if (arguments.length > 1) {\n                var json = {};\n                json[params] = value;\n                params = json;\n            } else {\n                return eve(\"snap.util.getattr.\" + params, el).firstDefined();\n            }\n        }\n        for (var att in params) {\n            if (params[has](att)) {\n                eve(\"snap.util.attr.\" + att, el, params[att]);\n            }\n        }\n        return el;\n    };\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n    var f = glob.doc.createDocumentFragment(),\n        full = true,\n        div = glob.doc.createElement(\"div\");\n    svg = Str(svg);\n    if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n        svg = \"<svg>\" + svg + \"</svg>\";\n        full = false;\n    }\n    div.innerHTML = svg;\n    svg = div.getElementsByTagName(\"svg\")[0];\n    if (svg) {\n        if (full) {\n            f = svg;\n        } else {\n            while (svg.firstChild) {\n                f.appendChild(svg.firstChild);\n            }\n        }\n    }\n    return new Fragment(f);\n};\nfunction Fragment(frag) {\n    this.node = frag;\n}\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n    var args = Array.prototype.slice.call(arguments, 0),\n        f = glob.doc.createDocumentFragment();\n    for (var i = 0, ii = args.length; i < ii; i++) {\n        var item = args[i];\n        if (item.node && item.node.nodeType) {\n            f.appendChild(item.node);\n        }\n        if (item.nodeType) {\n            f.appendChild(item);\n        }\n        if (typeof item == \"string\") {\n            f.appendChild(Snap.parse(item).node);\n        }\n    }\n    return new Fragment(f);\n};\n\nfunction make(name, parent) {\n    var res = $(name);\n    parent.appendChild(res);\n    var el = wrap(res);\n    return el;\n}\nfunction Paper(w, h) {\n    var res,\n        desc,\n        defs,\n        proto = Paper.prototype;\n    if (w && w.tagName && w.tagName.toLowerCase() == \"svg\") {\n        if (w.snap in hub) {\n            return hub[w.snap];\n        }\n        var doc = w.ownerDocument;\n        res = new Element(w);\n        desc = w.getElementsByTagName(\"desc\")[0];\n        defs = w.getElementsByTagName(\"defs\")[0];\n        if (!desc) {\n            desc = $(\"desc\");\n            desc.appendChild(doc.createTextNode(\"Created with Snap\"));\n            res.node.appendChild(desc);\n        }\n        if (!defs) {\n            defs = $(\"defs\");\n            res.node.appendChild(defs);\n        }\n        res.defs = defs;\n        for (var key in proto) if (proto[has](key)) {\n            res[key] = proto[key];\n        }\n        res.paper = res.root = res;\n    } else {\n        res = make(\"svg\", glob.doc.body);\n        $(res.node, {\n            height: h,\n            version: 1.1,\n            width: w,\n            xmlns: xmlns\n        });\n    }\n    return res;\n}\nfunction wrap(dom) {\n    if (!dom) {\n        return dom;\n    }\n    if (dom instanceof Element || dom instanceof Fragment) {\n        return dom;\n    }\n    if (dom.tagName && dom.tagName.toLowerCase() == \"svg\") {\n        return new Paper(dom);\n    }\n    if (dom.tagName && dom.tagName.toLowerCase() == \"object\" && dom.type == \"image/svg+xml\") {\n        return new Paper(dom.contentDocument.getElementsByTagName(\"svg\")[0]);\n    }\n    return new Element(dom);\n}\n\nSnap._.make = make;\nSnap._.wrap = wrap;\n/*\\\n * Paper.el\n [ method ]\n **\n * Creates an element on paper with a given name and no attributes\n **\n - name (string) tag name\n - attr (object) attributes\n = (Element) the current element\n > Usage\n | var c = paper.circle(10, 10, 10); // is the same as...\n | var c = paper.el(\"circle\").attr({\n |     cx: 10,\n |     cy: 10,\n |     r: 10\n | });\n | // and the same as\n | var c = paper.el(\"circle\", {\n |     cx: 10,\n |     cy: 10,\n |     r: 10\n | });\n\\*/\nPaper.prototype.el = function (name, attr) {\n    var el = make(name, this.node);\n    attr && el.attr(attr);\n    return el;\n};\n/*\\\n * Element.children\n [ method ]\n **\n * Returns array of all the children of the element.\n = (array) array of Elements\n\\*/\nElement.prototype.children = function () {\n    var out = [],\n        ch = this.node.childNodes;\n    for (var i = 0, ii = ch.length; i < ii; i++) {\n        out[i] = Snap(ch[i]);\n    }\n    return out;\n};\nfunction jsonFiller(root, o) {\n    for (var i = 0, ii = root.length; i < ii; i++) {\n        var item = {\n                type: root[i].type,\n                attr: root[i].attr()\n            },\n            children = root[i].children();\n        o.push(item);\n        if (children.length) {\n            jsonFiller(children, item.childNodes = []);\n        }\n    }\n}\n/*\\\n * Element.toJSON\n [ method ]\n **\n * Returns object representation of the given element and all its children.\n = (object) in format\n o {\n o     type (string) this.type,\n o     attr (object) attributes map,\n o     childNodes (array) optional array of children in the same format\n o }\n\\*/\nElement.prototype.toJSON = function () {\n    var out = [];\n    jsonFiller([this], out);\n    return out[0];\n};\n// default\neve.on(\"snap.util.getattr\", function () {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    var css = att.replace(/[A-Z]/g, function (letter) {\n        return \"-\" + letter.toLowerCase();\n    });\n    if (cssAttr[has](css)) {\n        return this.node.ownerDocument.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n    } else {\n        return $(this.node, att);\n    }\n});\nvar cssAttr = {\n    \"alignment-baseline\": 0,\n    \"baseline-shift\": 0,\n    \"clip\": 0,\n    \"clip-path\": 0,\n    \"clip-rule\": 0,\n    \"color\": 0,\n    \"color-interpolation\": 0,\n    \"color-interpolation-filters\": 0,\n    \"color-profile\": 0,\n    \"color-rendering\": 0,\n    \"cursor\": 0,\n    \"direction\": 0,\n    \"display\": 0,\n    \"dominant-baseline\": 0,\n    \"enable-background\": 0,\n    \"fill\": 0,\n    \"fill-opacity\": 0,\n    \"fill-rule\": 0,\n    \"filter\": 0,\n    \"flood-color\": 0,\n    \"flood-opacity\": 0,\n    \"font\": 0,\n    \"font-family\": 0,\n    \"font-size\": 0,\n    \"font-size-adjust\": 0,\n    \"font-stretch\": 0,\n    \"font-style\": 0,\n    \"font-variant\": 0,\n    \"font-weight\": 0,\n    \"glyph-orientation-horizontal\": 0,\n    \"glyph-orientation-vertical\": 0,\n    \"image-rendering\": 0,\n    \"kerning\": 0,\n    \"letter-spacing\": 0,\n    \"lighting-color\": 0,\n    \"marker\": 0,\n    \"marker-end\": 0,\n    \"marker-mid\": 0,\n    \"marker-start\": 0,\n    \"mask\": 0,\n    \"opacity\": 0,\n    \"overflow\": 0,\n    \"pointer-events\": 0,\n    \"shape-rendering\": 0,\n    \"stop-color\": 0,\n    \"stop-opacity\": 0,\n    \"stroke\": 0,\n    \"stroke-dasharray\": 0,\n    \"stroke-dashoffset\": 0,\n    \"stroke-linecap\": 0,\n    \"stroke-linejoin\": 0,\n    \"stroke-miterlimit\": 0,\n    \"stroke-opacity\": 0,\n    \"stroke-width\": 0,\n    \"text-anchor\": 0,\n    \"text-decoration\": 0,\n    \"text-rendering\": 0,\n    \"unicode-bidi\": 0,\n    \"visibility\": 0,\n    \"word-spacing\": 0,\n    \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n    var att = eve.nt(),\n        attr = {};\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    attr[att] = value;\n    var style = att.replace(/-(\\w)/gi, function (all, letter) {\n            return letter.toUpperCase();\n        }),\n        css = att.replace(/[A-Z]/g, function (letter) {\n            return \"-\" + letter.toLowerCase();\n        });\n    if (cssAttr[has](css)) {\n        this.node.style[style] = value == null ? E : value;\n    } else {\n        $(this.node, attr);\n    }\n});\n(function (proto) {}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n    var req = new XMLHttpRequest,\n        id = ID();\n    if (req) {\n        if (is(postData, \"function\")) {\n            scope = callback;\n            callback = postData;\n            postData = null;\n        } else if (is(postData, \"object\")) {\n            var pd = [];\n            for (var key in postData) if (postData.hasOwnProperty(key)) {\n                pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n            }\n            postData = pd.join(\"&\");\n        }\n        req.open(postData ? \"POST\" : \"GET\", url, true);\n        if (postData) {\n            req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n        }\n        if (callback) {\n            eve.once(\"snap.ajax.\" + id + \".0\", callback);\n            eve.once(\"snap.ajax.\" + id + \".200\", callback);\n            eve.once(\"snap.ajax.\" + id + \".304\", callback);\n        }\n        req.onreadystatechange = function() {\n            if (req.readyState != 4) return;\n            eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n        };\n        if (req.readyState == 4) {\n            return req;\n        }\n        req.send(postData);\n        return req;\n    }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n    Snap.ajax(url, function (req) {\n        var f = Snap.parse(req.responseText);\n        scope ? callback.call(scope, f) : callback(f);\n    });\n};\nvar getOffset = function (elem) {\n    var box = elem.getBoundingClientRect(),\n        doc = elem.ownerDocument,\n        body = doc.body,\n        docElem = doc.documentElement,\n        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n        top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n        left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n    return {\n        y: top,\n        x: left\n    };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n    var paper = this,\n        svg = paper.canvas,\n        target = glob.doc.elementFromPoint(x, y);\n    if (glob.win.opera && target.tagName == \"svg\") {\n        var so = getOffset(target),\n            sr = target.createSVGRect();\n        sr.x = x - so.x;\n        sr.y = y - so.y;\n        sr.width = sr.height = 1;\n        var hits = target.getIntersectionList(sr, null);\n        if (hits.length) {\n            target = hits[hits.length - 1];\n        }\n    }\n    if (!target) {\n        return null;\n    }\n    return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with five arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global, Fragment) {\n |     Snap.newmethod = function () {};\n |     Element.prototype.newmethod = function () {};\n |     Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n    f(Snap, Element, Paper, glob, Fragment);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}(window || this));\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        Str = String,\n        unit2px = Snap._unit2px,\n        $ = Snap._.$,\n        make = Snap._.make,\n        getSomeDefs = Snap._.getSomeDefs,\n        has = \"hasOwnProperty\",\n        wrap = Snap._.wrap;\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Returns the bounding box descriptor for the given element\n     **\n     = (object) bounding box descriptor:\n     o {\n     o     cx: (number) x of the center,\n     o     cy: (number) x of the center,\n     o     h: (number) height,\n     o     height: (number) height,\n     o     path: (string) path command for the box,\n     o     r0: (number) radius of a circle that fully encloses the box,\n     o     r1: (number) radius of the smallest circle that can be enclosed,\n     o     r2: (number) radius of the largest circle that can be enclosed,\n     o     vb: (string) box as a viewbox command,\n     o     w: (number) width,\n     o     width: (number) width,\n     o     x2: (number) x of the right side,\n     o     x: (number) x of the left side,\n     o     y2: (number) y of the bottom edge,\n     o     y: (number) y of the top edge\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        if (this.type == \"tspan\") {\n            return Snap._.box(this.node.getClientRects().item(0));\n        }\n        if (!Snap.Matrix || !Snap.path) {\n            return this.node.getBBox();\n        }\n        var el = this,\n            m = new Snap.Matrix;\n        if (el.removed) {\n            return Snap._.box();\n        }\n        while (el.type == \"use\") {\n            if (!isWithoutTransform) {\n                m = m.add(el.transform().localMatrix.translate(el.attr(\"x\") || 0, el.attr(\"y\") || 0));\n            }\n            if (el.original) {\n                el = el.original;\n            } else {\n                var href = el.attr(\"xlink:href\");\n                el = el.original = el.node.ownerDocument.getElementById(href.substring(href.indexOf(\"#\") + 1));\n            }\n        }\n        var _ = el._,\n            pathfinder = Snap.path.get[el.type] || Snap.path.get.deflt;\n        try {\n            if (isWithoutTransform) {\n                _.bboxwt = pathfinder ? Snap.path.getBBox(el.realPath = pathfinder(el)) : Snap._.box(el.node.getBBox());\n                return Snap._.box(_.bboxwt);\n            } else {\n                el.realPath = pathfinder(el);\n                el.matrix = el.transform().localMatrix;\n                _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, m.add(el.matrix)));\n                return Snap._.box(_.bbox);\n            }\n        } catch (e) {\n            // Firefox doesn’t give you bbox of hidden element\n            return Snap._.box();\n        }\n    };\n    var propString = function () {\n        return this.string;\n    };\n    function extractTransform(el, tstr) {\n        if (tstr == null) {\n            var doReturn = true;\n            if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n                tstr = el.node.getAttribute(\"gradientTransform\");\n            } else if (el.type == \"pattern\") {\n                tstr = el.node.getAttribute(\"patternTransform\");\n            } else {\n                tstr = el.node.getAttribute(\"transform\");\n            }\n            if (!tstr) {\n                return new Snap.Matrix;\n            }\n            tstr = Snap._.svgTransform2string(tstr);\n        } else {\n            if (!Snap._.rgTransform.test(tstr)) {\n                tstr = Snap._.svgTransform2string(tstr);\n            } else {\n                tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || \"\");\n            }\n            if (is(tstr, \"array\")) {\n                tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n            }\n            el._.transform = tstr;\n        }\n        var m = Snap._.transform2matrix(tstr, el.getBBox(1));\n        if (doReturn) {\n            return m;\n        } else {\n            el.matrix = m;\n        }\n    }\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Gets or sets transformation of the element\n     **\n     - tstr (string) transform string in Snap or SVG format\n     = (Element) the current element\n     * or\n     = (object) transformation descriptor:\n     o {\n     o     string (string) transform string,\n     o     globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n     o     localMatrix (Matrix) matrix of transformations applied only to the element,\n     o     diffMatrix (Matrix) matrix of difference between global and local transformations,\n     o     global (string) global transformation as string,\n     o     local (string) local transformation as string,\n     o     toString (function) returns `string` property\n     o }\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            var papa = this,\n                global = new Snap.Matrix(this.node.getCTM()),\n                local = extractTransform(this),\n                ms = [local],\n                m = new Snap.Matrix,\n                i,\n                localString = local.toTransformString(),\n                string = Str(local) == Str(this.matrix) ?\n                            Str(_.transform) : localString;\n            while (papa.type != \"svg\" && (papa = papa.parent())) {\n                ms.push(extractTransform(papa));\n            }\n            i = ms.length;\n            while (i--) {\n                m.add(ms[i]);\n            }\n            return {\n                string: string,\n                globalMatrix: global,\n                totalMatrix: m,\n                localMatrix: local,\n                diffMatrix: global.clone().add(local.invert()),\n                global: global.toTransformString(),\n                total: m.toTransformString(),\n                local: localString,\n                toString: propString\n            };\n        }\n        if (tstr instanceof Snap.Matrix) {\n            this.matrix = tstr;\n            this._.transform = tstr.toTransformString();\n        } else {\n            extractTransform(this, tstr);\n        }\n\n        if (this.node) {\n            if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n                $(this.node, {gradientTransform: this.matrix});\n            } else if (this.type == \"pattern\") {\n                $(this.node, {patternTransform: this.matrix});\n            } else {\n                $(this.node, {transform: this.matrix});\n            }\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.parent\n     [ method ]\n     **\n     * Returns the element's parent\n     **\n     = (Element) the parent element\n    \\*/\n    elproto.parent = function () {\n        return wrap(this.node.parentNode);\n    };\n    /*\\\n     * Element.append\n     [ method ]\n     **\n     * Appends the given element to current one\n     **\n     - el (Element|Set) element to append\n     = (Element) the parent element\n    \\*/\n    /*\\\n     * Element.add\n     [ method ]\n     **\n     * See @Element.append\n    \\*/\n    elproto.append = elproto.add = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this;\n                el.forEach(function (el) {\n                    it.add(el);\n                });\n                return this;\n            }\n            el = wrap(el);\n            this.node.appendChild(el.node);\n            el.paper = this.paper;\n        }\n        return this;\n    };\n    /*\\\n     * Element.appendTo\n     [ method ]\n     **\n     * Appends the current element to the given one\n     **\n     - el (Element) parent element to append to\n     = (Element) the child element\n    \\*/\n    elproto.appendTo = function (el) {\n        if (el) {\n            el = wrap(el);\n            el.append(this);\n        }\n        return this;\n    };\n    /*\\\n     * Element.prepend\n     [ method ]\n     **\n     * Prepends the given element to the current one\n     **\n     - el (Element) element to prepend\n     = (Element) the parent element\n    \\*/\n    elproto.prepend = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this,\n                    first;\n                el.forEach(function (el) {\n                    if (first) {\n                        first.after(el);\n                    } else {\n                        it.prepend(el);\n                    }\n                    first = el;\n                });\n                return this;\n            }\n            el = wrap(el);\n            var parent = el.parent();\n            this.node.insertBefore(el.node, this.node.firstChild);\n            this.add && this.add();\n            el.paper = this.paper;\n            this.parent() && this.parent().add();\n            parent && parent.add();\n        }\n        return this;\n    };\n    /*\\\n     * Element.prependTo\n     [ method ]\n     **\n     * Prepends the current element to the given one\n     **\n     - el (Element) parent element to prepend to\n     = (Element) the child element\n    \\*/\n    elproto.prependTo = function (el) {\n        el = wrap(el);\n        el.prepend(this);\n        return this;\n    };\n    /*\\\n     * Element.before\n     [ method ]\n     **\n     * Inserts given element before the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.before = function (el) {\n        if (el.type == \"set\") {\n            var it = this;\n            el.forEach(function (el) {\n                var parent = el.parent();\n                it.node.parentNode.insertBefore(el.node, it.node);\n                parent && parent.add();\n            });\n            this.parent().add();\n            return this;\n        }\n        el = wrap(el);\n        var parent = el.parent();\n        this.node.parentNode.insertBefore(el.node, this.node);\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.after\n     [ method ]\n     **\n     * Inserts given element after the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.after = function (el) {\n        el = wrap(el);\n        var parent = el.parent();\n        if (this.node.nextSibling) {\n            this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n        } else {\n            this.node.parentNode.appendChild(el.node);\n        }\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertBefore = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertAfter = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the DOM\n     = (Element) the detached element\n    \\*/\n    elproto.remove = function () {\n        var parent = this.parent();\n        this.node.parentNode && this.node.parentNode.removeChild(this.node);\n        delete this.paper;\n        this.removed = true;\n        parent && parent.add();\n        return this;\n    };\n    /*\\\n     * Element.select\n     [ method ]\n     **\n     * Gathers the nested @Element matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Element) result of query selection\n    \\*/\n    elproto.select = function (query) {\n        return wrap(this.node.querySelector(query));\n    };\n    /*\\\n     * Element.selectAll\n     [ method ]\n     **\n     * Gathers nested @Element objects matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Set|array) result of query selection\n    \\*/\n    elproto.selectAll = function (query) {\n        var nodelist = this.node.querySelectorAll(query),\n            set = (Snap.set || Array)();\n        for (var i = 0; i < nodelist.length; i++) {\n            set.push(wrap(nodelist[i]));\n        }\n        return set;\n    };\n    /*\\\n     * Element.asPX\n     [ method ]\n     **\n     * Returns given attribute of the element as a `px` value (not %, em, etc.)\n     **\n     - attr (string) attribute name\n     - value (string) #optional attribute value\n     = (Element) result of query selection\n    \\*/\n    elproto.asPX = function (attr, value) {\n        if (value == null) {\n            value = this.attr(attr);\n        }\n        return +unit2px(this, attr, value);\n    };\n    // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned <use> instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n    /*\\\n     * Element.use\n     [ method ]\n     **\n     * Creates a `<use>` element linked to the current element\n     **\n     = (Element) the `<use>` element\n    \\*/\n    elproto.use = function () {\n        var use,\n            id = this.node.id;\n        if (!id) {\n            id = this.id;\n            $(this.node, {\n                id: id\n            });\n        }\n        if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n            this.type == \"pattern\") {\n            use = make(this.type, this.node.parentNode);\n        } else {\n            use = make(\"use\", this.node.parentNode);\n        }\n        $(use.node, {\n            \"xlink:href\": \"#\" + id\n        });\n        use.original = this;\n        return use;\n    };\n    function fixids(el) {\n        var els = el.selectAll(\"*\"),\n            it,\n            url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n            ids = [],\n            uses = {};\n        function urltest(it, name) {\n            var val = $(it.node, name);\n            val = val && val.match(url);\n            val = val && val[2];\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    var attr = {};\n                    attr[name] = Snap.url(id);\n                    $(it.node, attr);\n                });\n            }\n        }\n        function linktest(it) {\n            var val = $(it.node, \"xlink:href\");\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    it.attr(\"xlink:href\", \"#\" + id);\n                });\n            }\n        }\n        for (var i = 0, ii = els.length; i < ii; i++) {\n            it = els[i];\n            urltest(it, \"fill\");\n            urltest(it, \"stroke\");\n            urltest(it, \"filter\");\n            urltest(it, \"mask\");\n            urltest(it, \"clip-path\");\n            linktest(it);\n            var oldid = $(it.node, \"id\");\n            if (oldid) {\n                $(it.node, {id: it.id});\n                ids.push({\n                    old: oldid,\n                    id: it.id\n                });\n            }\n        }\n        for (i = 0, ii = ids.length; i < ii; i++) {\n            var fs = uses[ids[i].old];\n            if (fs) {\n                for (var j = 0, jj = fs.length; j < jj; j++) {\n                    fs[j](ids[i].id);\n                }\n            }\n        }\n    }\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     * Creates a clone of the element and inserts it after the element\n     **\n     = (Element) the clone\n    \\*/\n    elproto.clone = function () {\n        var clone = wrap(this.node.cloneNode(true));\n        if ($(clone.node, \"id\")) {\n            $(clone.node, {id: clone.id});\n        }\n        fixids(clone);\n        clone.insertAfter(this);\n        return clone;\n    };\n    /*\\\n     * Element.toDefs\n     [ method ]\n     **\n     * Moves element to the shared `<defs>` area\n     **\n     = (Element) the element\n    \\*/\n    elproto.toDefs = function () {\n        var defs = getSomeDefs(this);\n        defs.appendChild(this.node);\n        return this;\n    };\n    /*\\\n     * Element.toPattern\n     [ method ]\n     **\n     * Creates a `<pattern>` element from the current element\n     **\n     * To create a pattern you have to specify the pattern rect:\n     - x (string|number)\n     - y (string|number)\n     - width (string|number)\n     - height (string|number)\n     = (Element) the `<pattern>` element\n     * You can use pattern later on as an argument for `fill` attribute:\n     | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n     |         fill: \"none\",\n     |         stroke: \"#bada55\",\n     |         strokeWidth: 5\n     |     }).pattern(0, 0, 10, 10),\n     |     c = paper.circle(200, 200, 100);\n     | c.attr({\n     |     fill: p\n     | });\n    \\*/\n    elproto.pattern = elproto.toPattern = function (x, y, width, height) {\n        var p = make(\"pattern\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        $(p.node, {\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            patternUnits: \"userSpaceOnUse\",\n            id: p.id,\n            viewBox: [x, y, width, height].join(\" \")\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values.  Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where?  Couldn't they also be assigned default values?\n    /*\\\n     * Element.marker\n     [ method ]\n     **\n     * Creates a `<marker>` element from the current element\n     **\n     * To create a marker you have to specify the bounding rect and reference point:\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - refX (number)\n     - refY (number)\n     = (Element) the `<marker>` element\n     * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n    \\*/\n    // TODO add usage for markers\n    elproto.marker = function (x, y, width, height, refX, refY) {\n        var p = make(\"marker\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            refX = x.refX || x.cx;\n            refY = x.refY || x.cy;\n            x = x.x;\n        }\n        $(p.node, {\n            viewBox: [x, y, width, height].join(\" \"),\n            markerWidth: width,\n            markerHeight: height,\n            orient: \"auto\",\n            refX: refX || 0,\n            refY: refY || 0,\n            id: p.id\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n    var eldata = {};\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key. (Don’t confuse\n     * with `data-` attributes)\n     *\n     * See also @Element.removeData\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 0){\n            eve(\"snap.data.get.\" + this.id, this, data, null);\n            return data;\n        }\n        if (arguments.length == 1) {\n            if (Snap.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"snap.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"snap.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            eldata[this.id] = {};\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n    /*\\\n     * Element.outerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n     *\n     * See also @Element.innerSVG\n     = (string) SVG code for the element\n    \\*/\n    /*\\\n     * Element.toString\n     [ method ]\n     **\n     * See @Element.outerSVG\n    \\*/\n    elproto.outerSVG = elproto.toString = toString(1);\n    /*\\\n     * Element.innerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.innerSVG = toString();\n    function toString(type) {\n        return function () {\n            var res = type ? \"<\" + this.type : \"\",\n                attr = this.node.attributes,\n                chld = this.node.childNodes;\n            if (type) {\n                for (var i = 0, ii = attr.length; i < ii; i++) {\n                    res += \" \" + attr[i].name + '=\"' +\n                            attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n                }\n            }\n            if (chld.length) {\n                type && (res += \">\");\n                for (i = 0, ii = chld.length; i < ii; i++) {\n                    if (chld[i].nodeType == 3) {\n                        res += chld[i].nodeValue;\n                    } else if (chld[i].nodeType == 1) {\n                        res += wrap(chld[i]).toString();\n                    }\n                }\n                type && (res += \"</\" + this.type + \">\");\n            } else {\n                type && (res += \"/>\");\n            }\n            return res;\n        };\n    }\n    elproto.toDataURL = function () {\n        if (window && window.btoa) {\n            var bb = this.getBBox(),\n                svg = Snap.format('<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"{width}\" height=\"{height}\" viewBox=\"{x} {y} {width} {height}\">{contents}</svg>', {\n                x: +bb.x.toFixed(3),\n                y: +bb.y.toFixed(3),\n                width: +bb.width.toFixed(3),\n                height: +bb.height.toFixed(3),\n                contents: this.outerSVG()\n            });\n            return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(svg)));\n        }\n    };\n    /*\\\n     * Fragment.select\n     [ method ]\n     **\n     * See @Element.select\n    \\*/\n    Fragment.prototype.select = elproto.select;\n    /*\\\n     * Fragment.selectAll\n     [ method ]\n     **\n     * See @Element.selectAll\n    \\*/\n    Fragment.prototype.selectAll = elproto.selectAll;\n});\n\n// Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        Str = String,\n        has = \"hasOwnProperty\";\n    function slice(from, to, f) {\n        return function (arr) {\n            var res = arr.slice(from, to);\n            if (res.length == 1) {\n                res = res[0];\n            }\n            return f ? f(res) : res;\n        };\n    }\n    var Animation = function (attr, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        this.attr = attr;\n        this.dur = ms;\n        easing && (this.easing = easing);\n        callback && (this.callback = callback);\n    };\n    Snap._.Animation = Animation;\n    /*\\\n     * Snap.animation\n     [ method ]\n     **\n     * Creates an animation object\n     **\n     - attr (object) attributes of final destination\n     - duration (number) duration of the animation, in milliseconds\n     - easing (function) #optional one of easing functions of @mina or custom one\n     - callback (function) #optional callback function that fires when animation ends\n     = (object) animation object\n    \\*/\n    Snap.animation = function (attr, ms, easing, callback) {\n        return new Animation(attr, ms, easing, callback);\n    };\n    /*\\\n     * Element.inAnim\n     [ method ]\n     **\n     * Returns a set of animations that may be able to manipulate the current element\n     **\n     = (object) in format:\n     o {\n     o     anim (object) animation object,\n     o     mina (object) @mina object,\n     o     curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    elproto.inAnim = function () {\n        var el = this,\n            res = [];\n        for (var id in el.anims) if (el.anims[has](id)) {\n            (function (a) {\n                res.push({\n                    anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n                    mina: a,\n                    curStatus: a.status(),\n                    status: function (val) {\n                        return a.status(val);\n                    },\n                    stop: function () {\n                        a.stop();\n                    }\n                });\n            }(el.anims[id]));\n        }\n        return res;\n    };\n    /*\\\n     * Snap.animate\n     [ method ]\n     **\n     * Runs generic animation of one number into another with a caring function\n     **\n     - from (number|array) number or array of numbers\n     - to (number|array) number or array of numbers\n     - setter (function) caring function that accepts one number argument\n     - duration (number) duration, in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function to execute when animation ends\n     = (object) animation object in @mina format\n     o {\n     o     id (string) animation id, consider it read-only,\n     o     duration (function) gets or sets the duration of the animation,\n     o     easing (function) easing,\n     o     speed (function) gets or sets the speed of the animation,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n     | var rect = Snap().rect(0, 0, 10, 10);\n     | Snap.animate(0, 10, function (val) {\n     |     rect.attr({\n     |         x: val\n     |     });\n     | }, 1000);\n     | // in given context is equivalent to\n     | rect.animate({x: 10}, 1000);\n    \\*/\n    Snap.animate = function (from, to, setter, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        var now = mina.time(),\n            anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n        callback && eve.once(\"mina.finish.\" + anim.id, callback);\n        return anim;\n    };\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops all the animations for the current element\n     **\n     = (Element) the current element\n    \\*/\n    elproto.stop = function () {\n        var anims = this.inAnim();\n        for (var i = 0, ii = anims.length; i < ii; i++) {\n            anims[i].stop();\n        }\n        return this;\n    };\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Animates the given attributes of the element\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     = (Element) the current element\n    \\*/\n    elproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = attrs.dur;\n            attrs = attrs.attr;\n        }\n        var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n            el = this;\n        for (var key in attrs) if (attrs[has](key)) {\n            if (el.equal) {\n                eq = el.equal(key, Str(attrs[key]));\n                from = eq.from;\n                to = eq.to;\n                f = eq.f;\n            } else {\n                from = +el.attr(key);\n                to = +attrs[key];\n            }\n            var len = is(from, \"array\") ? from.length : 1;\n            keys[key] = slice(fkeys.length, fkeys.length + len, f);\n            fkeys = fkeys.concat(from);\n            tkeys = tkeys.concat(to);\n        }\n        var now = mina.time(),\n            anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n                var attr = {};\n                for (var key in keys) if (keys[has](key)) {\n                    attr[key] = keys[key](val);\n                }\n                el.attr(attr);\n            }, easing);\n        el.anims[anim.id] = anim;\n        anim._attrs = attrs;\n        anim._callback = callback;\n        eve(\"snap.animcreated.\" + el.id, anim);\n        eve.once(\"mina.finish.\" + anim.id, function () {\n            eve.off(\"mina.*.\" + anim.id);\n            delete el.anims[anim.id];\n            callback && callback.call(el);\n        });\n        eve.once(\"mina.stop.\" + anim.id, function () {\n            eve.off(\"mina.*.\" + anim.id);\n            delete el.anims[anim.id];\n        });\n        return el;\n    };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var objectToString = Object.prototype.toString,\n        Str = String,\n        math = Math,\n        E = \"\";\n    function Matrix(a, b, c, d, e, f) {\n        if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n            this.a = a.a;\n            this.b = a.b;\n            this.c = a.c;\n            this.d = a.d;\n            this.e = a.e;\n            this.f = a.f;\n            return;\n        }\n        if (a != null) {\n            this.a = +a;\n            this.b = +b;\n            this.c = +c;\n            this.d = +d;\n            this.e = +e;\n            this.f = +f;\n        } else {\n            this.a = 1;\n            this.b = 0;\n            this.c = 0;\n            this.d = 1;\n            this.e = 0;\n            this.f = 0;\n        }\n    }\n    (function (matrixproto) {\n        /*\\\n         * Matrix.add\n         [ method ]\n         **\n         * Adds the given matrix to existing one\n         - a (number)\n         - b (number)\n         - c (number)\n         - d (number)\n         - e (number)\n         - f (number)\n         * or\n         - matrix (object) @Matrix\n        \\*/\n        matrixproto.add = function (a, b, c, d, e, f) {\n            if (a && a instanceof Matrix) {\n                return this.add(a.a, a.b, a.c, a.d, a.e, a.f);\n            }\n            var aNew = a * this.a + b * this.c,\n                bNew = a * this.b + b * this.d;\n            this.e += e * this.a + f * this.c;\n            this.f += e * this.b + f * this.d;\n            this.c = c * this.a + d * this.c;\n            this.d = c * this.b + d * this.d;\n\n            this.a = aNew;\n            this.b = bNew;\n            return this;\n        };\n        /*\\\n         * Matrix.multLeft\n         [ method ]\n         **\n         * Multiplies a passed affine transform to the left: M * this.\n         - a (number)\n         - b (number)\n         - c (number)\n         - d (number)\n         - e (number)\n         - f (number)\n         * or\n         - matrix (object) @Matrix\n        \\*/\n        Matrix.prototype.multLeft = function (a, b, c, d, e, f) {\n            if (a && a instanceof Matrix) {\n                return this.multLeft(a.a, a.b, a.c, a.d, a.e, a.f);\n            }\n            var aNew = a * this.a + c * this.b,\n                cNew = a * this.c + c * this.d,\n                eNew = a * this.e + c * this.f + e;\n            this.b = b * this.a + d * this.b;\n            this.d = b * this.c + d * this.d;\n            this.f = b * this.e + d * this.f + f;\n\n            this.a = aNew;\n            this.c = cNew;\n            this.e = eNew;\n            return this;\n        };\n        /*\\\n         * Matrix.invert\n         [ method ]\n         **\n         * Returns an inverted version of the matrix\n         = (object) @Matrix\n        \\*/\n        matrixproto.invert = function () {\n            var me = this,\n                x = me.a * me.d - me.b * me.c;\n            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n        };\n        /*\\\n         * Matrix.clone\n         [ method ]\n         **\n         * Returns a copy of the matrix\n         = (object) @Matrix\n        \\*/\n        matrixproto.clone = function () {\n            return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n        };\n        /*\\\n         * Matrix.translate\n         [ method ]\n         **\n         * Translate the matrix\n         - x (number) horizontal offset distance\n         - y (number) vertical offset distance\n        \\*/\n        matrixproto.translate = function (x, y) {\n            this.e += x * this.a + y * this.c;\n            this.f += x * this.b + y * this.d;\n            return this;\n        };\n        /*\\\n         * Matrix.scale\n         [ method ]\n         **\n         * Scales the matrix\n         - x (number) amount to be scaled, with `1` resulting in no change\n         - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n         - cx (number) #optional horizontal origin point from which to scale\n         - cy (number) #optional vertical origin point from which to scale\n         * Default cx, cy is the middle point of the element.\n        \\*/\n        matrixproto.scale = function (x, y, cx, cy) {\n            y == null && (y = x);\n            (cx || cy) && this.translate(cx, cy);\n            this.a *= x;\n            this.b *= x;\n            this.c *= y;\n            this.d *= y;\n            (cx || cy) && this.translate(-cx, -cy);\n            return this;\n        };\n        /*\\\n         * Matrix.rotate\n         [ method ]\n         **\n         * Rotates the matrix\n         - a (number) angle of rotation, in degrees\n         - x (number) horizontal origin point from which to rotate\n         - y (number) vertical origin point from which to rotate\n        \\*/\n        matrixproto.rotate = function (a, x, y) {\n            a = Snap.rad(a);\n            x = x || 0;\n            y = y || 0;\n            var cos = +math.cos(a).toFixed(9),\n                sin = +math.sin(a).toFixed(9);\n            this.add(cos, sin, -sin, cos, x, y);\n            return this.add(1, 0, 0, 1, -x, -y);\n        };\n        /*\\\n         * Matrix.skewX\n         [ method ]\n         **\n         * Skews the matrix along the x-axis\n         - x (number) Angle to skew along the x-axis (in degrees).\n        \\*/\n        matrixproto.skewX = function (x) {\n            return this.skew(x, 0);\n        };\n        /*\\\n         * Matrix.skewY\n         [ method ]\n         **\n         * Skews the matrix along the y-axis\n         - y (number) Angle to skew along the y-axis (in degrees).\n        \\*/\n        matrixproto.skewY = function (y) {\n            return this.skew(0, y);\n        };\n        /*\\\n         * Matrix.skew\n         [ method ]\n         **\n         * Skews the matrix\n         - y (number) Angle to skew along the y-axis (in degrees).\n         - x (number) Angle to skew along the x-axis (in degrees).\n        \\*/\n        matrixproto.skew = function (x, y) {\n            x = x || 0;\n            y = y || 0;\n            x = Snap.rad(x);\n            y = Snap.rad(y);\n            var c = math.tan(x).toFixed(9);\n            var b = math.tan(y).toFixed(9);\n            return this.add(1, b, c, 1, 0, 0);\n        };\n        /*\\\n         * Matrix.x\n         [ method ]\n         **\n         * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n         - x (number)\n         - y (number)\n         = (number) x\n        \\*/\n        matrixproto.x = function (x, y) {\n            return x * this.a + y * this.c + this.e;\n        };\n        /*\\\n         * Matrix.y\n         [ method ]\n         **\n         * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n         - x (number)\n         - y (number)\n         = (number) y\n        \\*/\n        matrixproto.y = function (x, y) {\n            return x * this.b + y * this.d + this.f;\n        };\n        matrixproto.get = function (i) {\n            return +this[Str.fromCharCode(97 + i)].toFixed(4);\n        };\n        matrixproto.toString = function () {\n            return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n        };\n        matrixproto.offset = function () {\n            return [this.e.toFixed(4), this.f.toFixed(4)];\n        };\n        function norm(a) {\n            return a[0] * a[0] + a[1] * a[1];\n        }\n        function normalize(a) {\n            var mag = math.sqrt(norm(a));\n            a[0] && (a[0] /= mag);\n            a[1] && (a[1] /= mag);\n        }\n        /*\\\n         * Matrix.determinant\n         [ method ]\n         **\n         * Finds determinant of the given matrix.\n         = (number) determinant\n        \\*/\n        matrixproto.determinant = function () {\n            return this.a * this.d - this.b * this.c;\n        };\n        /*\\\n         * Matrix.split\n         [ method ]\n         **\n         * Splits matrix into primitive transformations\n         = (object) in format:\n         o dx (number) translation by x\n         o dy (number) translation by y\n         o scalex (number) scale by x\n         o scaley (number) scale by y\n         o shear (number) shear\n         o rotate (number) rotation in deg\n         o isSimple (boolean) could it be represented via simple transformations\n        \\*/\n        matrixproto.split = function () {\n            var out = {};\n            // translation\n            out.dx = this.e;\n            out.dy = this.f;\n\n            // scale and shear\n            var row = [[this.a, this.b], [this.c, this.d]];\n            out.scalex = math.sqrt(norm(row[0]));\n            normalize(row[0]);\n\n            out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n            row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n            out.scaley = math.sqrt(norm(row[1]));\n            normalize(row[1]);\n            out.shear /= out.scaley;\n\n            if (this.determinant() < 0) {\n                out.scalex = -out.scalex;\n            }\n\n            // rotation\n            var sin = row[0][1],\n                cos = row[1][1];\n            if (cos < 0) {\n                out.rotate = Snap.deg(math.acos(cos));\n                if (sin < 0) {\n                    out.rotate = 360 - out.rotate;\n                }\n            } else {\n                out.rotate = Snap.deg(math.asin(sin));\n            }\n\n            out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n            out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n            out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n            return out;\n        };\n        /*\\\n         * Matrix.toTransformString\n         [ method ]\n         **\n         * Returns transform string that represents given matrix\n         = (string) transform string\n        \\*/\n        matrixproto.toTransformString = function (shorter) {\n            var s = shorter || this.split();\n            if (!+s.shear.toFixed(9)) {\n                s.scalex = +s.scalex.toFixed(4);\n                s.scaley = +s.scaley.toFixed(4);\n                s.rotate = +s.rotate.toFixed(4);\n                return  (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) +\n                        (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E) +\n                        (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E);\n            } else {\n                return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n            }\n        };\n    })(Matrix.prototype);\n    /*\\\n     * Snap.Matrix\n     [ method ]\n     **\n     * Matrix constructor, extend on your own risk.\n     * To create matrices use @Snap.matrix.\n    \\*/\n    Snap.Matrix = Matrix;\n    /*\\\n     * Snap.matrix\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns a matrix based on the given parameters\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     * or\n     - svgMatrix (SVGMatrix)\n     = (object) @Matrix\n    \\*/\n    Snap.matrix = function (a, b, c, d, e, f) {\n        return new Matrix(a, b, c, d, e, f);\n    };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var has = \"hasOwnProperty\",\n        make = Snap._.make,\n        wrap = Snap._.wrap,\n        is = Snap.is,\n        getSomeDefs = Snap._.getSomeDefs,\n        reURLValue = /^url\\((['\"]?)([^)]+)\\1\\)$/,\n        $ = Snap._.$,\n        URL = Snap.url,\n        Str = String,\n        separator = Snap._.separator,\n        E = \"\";\n    /*\\\n     * Snap.deurl\n     [ method ]\n     **\n     * Unwraps path from `\"url(<path>)\"`.\n     - value (string) url path\n     = (string) unwrapped path\n    \\*/\n    Snap.deurl = function (value) {\n        var res = String(value).match(reURLValue);\n        return res ? res[2] : value;\n    }\n    // Attributes event handlers\n    eve.on(\"snap.util.attr.mask\", function (value) {\n        if (value instanceof Element || value instanceof Fragment) {\n            eve.stop();\n            if (value instanceof Fragment && value.node.childNodes.length == 1) {\n                value = value.node.firstChild;\n                getSomeDefs(this).appendChild(value);\n                value = wrap(value);\n            }\n            if (value.type == \"mask\") {\n                var mask = value;\n            } else {\n                mask = make(\"mask\", getSomeDefs(this));\n                mask.node.appendChild(value.node);\n            }\n            !mask.node.id && $(mask.node, {\n                id: mask.id\n            });\n            $(this.node, {\n                mask: URL(mask.id)\n            });\n        }\n    });\n    (function (clipIt) {\n        eve.on(\"snap.util.attr.clip\", clipIt);\n        eve.on(\"snap.util.attr.clip-path\", clipIt);\n        eve.on(\"snap.util.attr.clipPath\", clipIt);\n    }(function (value) {\n        if (value instanceof Element || value instanceof Fragment) {\n            eve.stop();\n            var clip,\n                node = value.node;\n            while (node) {\n                if (node.nodeName === \"clipPath\") {\n                    clip = new Element(node);\n                    break;\n                }\n                if (node.nodeName === \"svg\") {\n                    clip = undefined;\n                    break;\n                }\n                node = node.parentNode;\n            }\n            if (!clip) {\n                clip = make(\"clipPath\", getSomeDefs(this));\n                clip.node.appendChild(value.node);\n                !clip.node.id && $(clip.node, {\n                    id: clip.id\n                });\n            }\n            $(this.node, {\n                \"clip-path\": URL(clip.node.id || clip.id)\n            });\n        }\n    }));\n    function fillStroke(name) {\n        return function (value) {\n            eve.stop();\n            if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n                (value.node.firstChild.tagName == \"radialGradient\" ||\n                value.node.firstChild.tagName == \"linearGradient\" ||\n                value.node.firstChild.tagName == \"pattern\")) {\n                value = value.node.firstChild;\n                getSomeDefs(this).appendChild(value);\n                value = wrap(value);\n            }\n            if (value instanceof Element) {\n                if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n                   || value.type == \"pattern\") {\n                    if (!value.node.id) {\n                        $(value.node, {\n                            id: value.id\n                        });\n                    }\n                    var fill = URL(value.node.id);\n                } else {\n                    fill = value.attr(name);\n                }\n            } else {\n                fill = Snap.color(value);\n                if (fill.error) {\n                    var grad = Snap(getSomeDefs(this).ownerSVGElement).gradient(value);\n                    if (grad) {\n                        if (!grad.node.id) {\n                            $(grad.node, {\n                                id: grad.id\n                            });\n                        }\n                        fill = URL(grad.node.id);\n                    } else {\n                        fill = value;\n                    }\n                } else {\n                    fill = Str(fill);\n                }\n            }\n            var attrs = {};\n            attrs[name] = fill;\n            $(this.node, attrs);\n            this.node.style[name] = E;\n        };\n    }\n    eve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\n    eve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\n    var gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\n    eve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n        string = Str(string);\n        var tokens = string.match(gradrg);\n        if (!tokens) {\n            return null;\n        }\n        var type = tokens[1],\n            params = tokens[2],\n            stops = tokens[3];\n        params = params.split(/\\s*,\\s*/).map(function (el) {\n            return +el == el ? +el : el;\n        });\n        if (params.length == 1 && params[0] == 0) {\n            params = [];\n        }\n        stops = stops.split(\"-\");\n        stops = stops.map(function (el) {\n            el = el.split(\":\");\n            var out = {\n                color: el[0]\n            };\n            if (el[1]) {\n                out.offset = parseFloat(el[1]);\n            }\n            return out;\n        });\n        var len = stops.length,\n            start = 0,\n            j = 0;\n        function seed(i, end) {\n            var step = (end - start) / (i - j);\n            for (var k = j; k < i; k++) {\n                stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n            }\n            j = i;\n            start = end;\n        }\n        len--;\n        for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n            seed(i, stops[i].offset);\n        }\n        stops[len].offset = stops[len].offset || 100;\n        seed(len, stops[len].offset);\n        return {\n            type: type,\n            params: params,\n            stops: stops\n        };\n    });\n\n    eve.on(\"snap.util.attr.d\", function (value) {\n        eve.stop();\n        if (is(value, \"array\") && is(value[0], \"array\")) {\n            value = Snap.path.toString.call(value);\n        }\n        value = Str(value);\n        if (value.match(/[ruo]/i)) {\n            value = Snap.path.toAbsolute(value);\n        }\n        $(this.node, {d: value});\n    })(-1);\n    eve.on(\"snap.util.attr.#text\", function (value) {\n        eve.stop();\n        value = Str(value);\n        var txt = glob.doc.createTextNode(value);\n        while (this.node.firstChild) {\n            this.node.removeChild(this.node.firstChild);\n        }\n        this.node.appendChild(txt);\n    })(-1);\n    eve.on(\"snap.util.attr.path\", function (value) {\n        eve.stop();\n        this.attr({d: value});\n    })(-1);\n    eve.on(\"snap.util.attr.class\", function (value) {\n        eve.stop();\n        this.node.className.baseVal = value;\n    })(-1);\n    eve.on(\"snap.util.attr.viewBox\", function (value) {\n        var vb;\n        if (is(value, \"object\") && \"x\" in value) {\n            vb = [value.x, value.y, value.width, value.height].join(\" \");\n        } else if (is(value, \"array\")) {\n            vb = value.join(\" \");\n        } else {\n            vb = value;\n        }\n        $(this.node, {\n            viewBox: vb\n        });\n        eve.stop();\n    })(-1);\n    eve.on(\"snap.util.attr.transform\", function (value) {\n        this.transform(value);\n        eve.stop();\n    })(-1);\n    eve.on(\"snap.util.attr.r\", function (value) {\n        if (this.type == \"rect\") {\n            eve.stop();\n            $(this.node, {\n                rx: value,\n                ry: value\n            });\n        }\n    })(-1);\n    eve.on(\"snap.util.attr.textpath\", function (value) {\n        eve.stop();\n        if (this.type == \"text\") {\n            var id, tp, node;\n            if (!value && this.textPath) {\n                tp = this.textPath;\n                while (tp.node.firstChild) {\n                    this.node.appendChild(tp.node.firstChild);\n                }\n                tp.remove();\n                delete this.textPath;\n                return;\n            }\n            if (is(value, \"string\")) {\n                var defs = getSomeDefs(this),\n                    path = wrap(defs.parentNode).path(value);\n                defs.appendChild(path.node);\n                id = path.id;\n                path.attr({id: id});\n            } else {\n                value = wrap(value);\n                if (value instanceof Element) {\n                    id = value.attr(\"id\");\n                    if (!id) {\n                        id = value.id;\n                        value.attr({id: id});\n                    }\n                }\n            }\n            if (id) {\n                tp = this.textPath;\n                node = this.node;\n                if (tp) {\n                    tp.attr({\"xlink:href\": \"#\" + id});\n                } else {\n                    tp = $(\"textPath\", {\n                        \"xlink:href\": \"#\" + id\n                    });\n                    while (node.firstChild) {\n                        tp.appendChild(node.firstChild);\n                    }\n                    node.appendChild(tp);\n                    this.textPath = wrap(tp);\n                }\n            }\n        }\n    })(-1);\n    eve.on(\"snap.util.attr.text\", function (value) {\n        if (this.type == \"text\") {\n            var i = 0,\n                node = this.node,\n                tuner = function (chunk) {\n                    var out = $(\"tspan\");\n                    if (is(chunk, \"array\")) {\n                        for (var i = 0; i < chunk.length; i++) {\n                            out.appendChild(tuner(chunk[i]));\n                        }\n                    } else {\n                        out.appendChild(glob.doc.createTextNode(chunk));\n                    }\n                    out.normalize && out.normalize();\n                    return out;\n                };\n            while (node.firstChild) {\n                node.removeChild(node.firstChild);\n            }\n            var tuned = tuner(value);\n            while (tuned.firstChild) {\n                node.appendChild(tuned.firstChild);\n            }\n        }\n        eve.stop();\n    })(-1);\n    function setFontSize(value) {\n        eve.stop();\n        if (value == +value) {\n            value += \"px\";\n        }\n        this.node.style.fontSize = value;\n    }\n    eve.on(\"snap.util.attr.fontSize\", setFontSize)(-1);\n    eve.on(\"snap.util.attr.font-size\", setFontSize)(-1);\n\n\n    eve.on(\"snap.util.getattr.transform\", function () {\n        eve.stop();\n        return this.transform();\n    })(-1);\n    eve.on(\"snap.util.getattr.textpath\", function () {\n        eve.stop();\n        return this.textPath;\n    })(-1);\n    // Markers\n    (function () {\n        function getter(end) {\n            return function () {\n                eve.stop();\n                var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n                if (style == \"none\") {\n                    return style;\n                } else {\n                    return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n                }\n            };\n        }\n        function setter(end) {\n            return function (value) {\n                eve.stop();\n                var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n                if (value == \"\" || !value) {\n                    this.node.style[name] = \"none\";\n                    return;\n                }\n                if (value.type == \"marker\") {\n                    var id = value.node.id;\n                    if (!id) {\n                        $(value.node, {id: value.id});\n                    }\n                    this.node.style[name] = URL(id);\n                    return;\n                }\n            };\n        }\n        eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n        eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n        eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n        eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n        eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n        eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n        eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n        eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n        eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n        eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n        eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n        eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n    }());\n    eve.on(\"snap.util.getattr.r\", function () {\n        if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n            eve.stop();\n            return $(this.node, \"rx\");\n        }\n    })(-1);\n    function textExtract(node) {\n        var out = [];\n        var children = node.childNodes;\n        for (var i = 0, ii = children.length; i < ii; i++) {\n            var chi = children[i];\n            if (chi.nodeType == 3) {\n                out.push(chi.nodeValue);\n            }\n            if (chi.tagName == \"tspan\") {\n                if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n                    out.push(chi.firstChild.nodeValue);\n                } else {\n                    out.push(textExtract(chi));\n                }\n            }\n        }\n        return out;\n    }\n    eve.on(\"snap.util.getattr.text\", function () {\n        if (this.type == \"text\" || this.type == \"tspan\") {\n            eve.stop();\n            var out = textExtract(this.node);\n            return out.length == 1 ? out[0] : out;\n        }\n    })(-1);\n    eve.on(\"snap.util.getattr.#text\", function () {\n        return this.node.textContent;\n    })(-1);\n    eve.on(\"snap.util.getattr.fill\", function (internal) {\n        if (internal) {\n            return;\n        }\n        eve.stop();\n        var value = eve(\"snap.util.getattr.fill\", this, true).firstDefined();\n        return Snap(Snap.deurl(value)) || value;\n    })(-1);\n    eve.on(\"snap.util.getattr.stroke\", function (internal) {\n        if (internal) {\n            return;\n        }\n        eve.stop();\n        var value = eve(\"snap.util.getattr.stroke\", this, true).firstDefined();\n        return Snap(Snap.deurl(value)) || value;\n    })(-1);\n    eve.on(\"snap.util.getattr.viewBox\", function () {\n        eve.stop();\n        var vb = $(this.node, \"viewBox\");\n        if (vb) {\n            vb = vb.split(separator);\n            return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n        } else {\n            return;\n        }\n    })(-1);\n    eve.on(\"snap.util.getattr.points\", function () {\n        var p = $(this.node, \"points\");\n        eve.stop();\n        if (p) {\n            return p.split(separator);\n        } else {\n            return;\n        }\n    })(-1);\n    eve.on(\"snap.util.getattr.path\", function () {\n        var p = $(this.node, \"d\");\n        eve.stop();\n        return p;\n    })(-1);\n    eve.on(\"snap.util.getattr.class\", function () {\n        return this.node.className.baseVal;\n    })(-1);\n    function getFontSize() {\n        eve.stop();\n        return this.node.style.fontSize;\n    }\n    eve.on(\"snap.util.getattr.fontSize\", getFontSize)(-1);\n    eve.on(\"snap.util.getattr.font-size\", getFontSize)(-1);\n});\n\n// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var rgNotSpace = /\\S+/g,\n        rgBadSpace = /[\\t\\r\\n\\f]/g,\n        rgTrim = /(^\\s+|\\s+$)/g,\n        Str = String,\n        elproto = Element.prototype;\n    /*\\\n     * Element.addClass\n     [ method ]\n     **\n     * Adds given class name or list of class names to the element.\n     - value (string) class name or space separated list of class names\n     **\n     = (Element) original element.\n    \\*/\n    elproto.addClass = function (value) {\n        var classes = Str(value || \"\").match(rgNotSpace) || [],\n            elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [],\n            j,\n            pos,\n            clazz,\n            finalValue;\n\n        if (classes.length) {\n            j = 0;\n            while (clazz = classes[j++]) {\n                pos = curClasses.indexOf(clazz);\n                if (!~pos) {\n                    curClasses.push(clazz);\n                }\n            }\n\n            finalValue = curClasses.join(\" \");\n            if (className != finalValue) {\n                elem.className.baseVal = finalValue;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Element.removeClass\n     [ method ]\n     **\n     * Removes given class name or list of class names from the element.\n     - value (string) class name or space separated list of class names\n     **\n     = (Element) original element.\n    \\*/\n    elproto.removeClass = function (value) {\n        var classes = Str(value || \"\").match(rgNotSpace) || [],\n            elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [],\n            j,\n            pos,\n            clazz,\n            finalValue;\n        if (curClasses.length) {\n            j = 0;\n            while (clazz = classes[j++]) {\n                pos = curClasses.indexOf(clazz);\n                if (~pos) {\n                    curClasses.splice(pos, 1);\n                }\n            }\n\n            finalValue = curClasses.join(\" \");\n            if (className != finalValue) {\n                elem.className.baseVal = finalValue;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Element.hasClass\n     [ method ]\n     **\n     * Checks if the element has a given class name in the list of class names applied to it.\n     - value (string) class name\n     **\n     = (boolean) `true` if the element has given class\n    \\*/\n    elproto.hasClass = function (value) {\n        var elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [];\n        return !!~curClasses.indexOf(value);\n    };\n    /*\\\n     * Element.toggleClass\n     [ method ]\n     **\n     * Add or remove one or more classes from the element, depending on either\n     * the class’s presence or the value of the `flag` argument.\n     - value (string) class name or space separated list of class names\n     - flag (boolean) value to determine whether the class should be added or removed\n     **\n     = (Element) original element.\n    \\*/\n    elproto.toggleClass = function (value, flag) {\n        if (flag != null) {\n            if (flag) {\n                return this.addClass(value);\n            } else {\n                return this.removeClass(value);\n            }\n        }\n        var classes = (value || \"\").match(rgNotSpace) || [],\n            elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [],\n            j,\n            pos,\n            clazz,\n            finalValue;\n        j = 0;\n        while (clazz = classes[j++]) {\n            pos = curClasses.indexOf(clazz);\n            if (~pos) {\n                curClasses.splice(pos, 1);\n            } else {\n                curClasses.push(clazz);\n            }\n        }\n\n        finalValue = curClasses.join(\" \");\n        if (className != finalValue) {\n            elem.className.baseVal = finalValue;\n        }\n        return this;\n    };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var operators = {\n            \"+\": function (x, y) {\n                    return x + y;\n                },\n            \"-\": function (x, y) {\n                    return x - y;\n                },\n            \"/\": function (x, y) {\n                    return x / y;\n                },\n            \"*\": function (x, y) {\n                    return x * y;\n                }\n        },\n        Str = String,\n        reUnit = /[a-z]+$/i,\n        reAddon = /^\\s*([+\\-\\/*])\\s*=\\s*([\\d.eE+\\-]+)\\s*([^\\d\\s]+)?\\s*$/;\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    eve.on(\"snap.util.attr\", function (val) {\n        var plus = Str(val).match(reAddon);\n        if (plus) {\n            var evnt = eve.nt(),\n                name = evnt.substring(evnt.lastIndexOf(\".\") + 1),\n                a = this.attr(name),\n                atr = {};\n            eve.stop();\n            var unit = plus[3] || \"\",\n                aUnit = a.match(reUnit),\n                op = operators[plus[1]];\n            if (aUnit && aUnit == unit) {\n                val = op(parseFloat(a), +plus[2]);\n            } else {\n                a = this.asPX(name);\n                val = op(this.asPX(name), this.asPX(name, plus[2] + unit));\n            }\n            if (isNaN(a) || isNaN(val)) {\n                return;\n            }\n            atr[name] = val;\n            this.attr(atr);\n        }\n    })(-10);\n    eve.on(\"snap.util.equal\", function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this,\n            bplus = Str(b).match(reAddon);\n        if (bplus) {\n            eve.stop();\n            var unit = bplus[3] || \"\",\n                aUnit = a.match(reUnit),\n                op = operators[bplus[1]];\n            if (aUnit && aUnit == unit) {\n                return {\n                    from: parseFloat(a),\n                    to: op(parseFloat(a), +bplus[2]),\n                    f: getUnit(aUnit)\n                };\n            } else {\n                a = this.asPX(name);\n                return {\n                    from: a,\n                    to: op(a, this.asPX(name, bplus[2] + unit)),\n                    f: getNumber\n                };\n            }\n        }\n    })(-10);\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var proto = Paper.prototype,\n        is = Snap.is;\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - rx (number) #optional horizontal radius for rounded corners, default is 0\n     - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n     = (object) the `rect` element\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    proto.rect = function (x, y, w, h, rx, ry) {\n        var attr;\n        if (ry == null) {\n            ry = rx;\n        }\n        if (is(x, \"object\") && x == \"[object Object]\") {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                width: w,\n                height: h\n            };\n            if (rx != null) {\n                attr.rx = rx;\n                attr.ry = ry;\n            }\n        }\n        return this.el(\"rect\", attr);\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) the `circle` element\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    proto.circle = function (cx, cy, r) {\n        var attr;\n        if (is(cx, \"object\") && cx == \"[object Object]\") {\n            attr = cx;\n        } else if (cx != null) {\n            attr = {\n                cx: cx,\n                cy: cy,\n                r: r\n            };\n        }\n        return this.el(\"circle\", attr);\n    };\n\n    var preload = (function () {\n        function onerror() {\n            this.parentNode.removeChild(this);\n        }\n        return function (src, f) {\n            var img = glob.doc.createElement(\"img\"),\n                body = glob.doc.body;\n            img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n            img.onload = function () {\n                f.call(img);\n                img.onload = img.onerror = null;\n                body.removeChild(img);\n            };\n            img.onerror = onerror;\n            body.appendChild(img);\n            img.src = src;\n        };\n    }());\n\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Places an image on the surface\n     **\n     - src (string) URI of the source image\n     - x (number) x offset position\n     - y (number) y offset position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) the `image` element\n     * or\n     = (object) Snap element object with type `image`\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    proto.image = function (src, x, y, width, height) {\n        var el = this.el(\"image\");\n        if (is(src, \"object\") && \"src\" in src) {\n            el.attr(src);\n        } else if (src != null) {\n            var set = {\n                \"xlink:href\": src,\n                preserveAspectRatio: \"none\"\n            };\n            if (x != null && y != null) {\n                set.x = x;\n                set.y = y;\n            }\n            if (width != null && height != null) {\n                set.width = width;\n                set.height = height;\n            } else {\n                preload(src, function () {\n                    Snap._.$(el.node, {\n                        width: this.offsetWidth,\n                        height: this.offsetHeight\n                    });\n                });\n            }\n            Snap._.$(el.node, set);\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) the `ellipse` element\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    proto.ellipse = function (cx, cy, rx, ry) {\n        var attr;\n        if (is(cx, \"object\") && cx == \"[object Object]\") {\n            attr = cx;\n        } else if (cx != null) {\n            attr ={\n                cx: cx,\n                cy: cy,\n                rx: rx,\n                ry: ry\n            };\n        }\n        return this.el(\"ellipse\", attr);\n    };\n    // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a `<path>` element using the given string as the path's definition\n     - pathString (string) #optional path string in SVG format\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n     | \"M10,20L30,40\"\n     * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n     * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n    \\*/\n    proto.path = function (d) {\n        var attr;\n        if (is(d, \"object\") && !is(d, \"array\")) {\n            attr = d;\n        } else if (d) {\n            attr = {d: d};\n        }\n        return this.el(\"path\", attr);\n    };\n    /*\\\n     * Paper.g\n     [ method ]\n     **\n     * Creates a group element\n     **\n     - varargs (…) #optional elements to nest within the group\n     = (object) the `g` element\n     **\n     > Usage\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g(c2, c1); // note that the order of elements is different\n     * or\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g();\n     | g.add(c2, c1);\n    \\*/\n    /*\\\n     * Paper.group\n     [ method ]\n     **\n     * See @Paper.g\n    \\*/\n    proto.group = proto.g = function (first) {\n        var attr,\n            el = this.el(\"g\");\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.svg\n     [ method ]\n     **\n     * Creates a nested SVG element.\n     - x (number) @optional X of the element\n     - y (number) @optional Y of the element\n     - width (number) @optional width of the element\n     - height (number) @optional height of the element\n     - vbx (number) @optional viewbox X\n     - vby (number) @optional viewbox Y\n     - vbw (number) @optional viewbox width\n     - vbh (number) @optional viewbox height\n     **\n     = (object) the `svg` element\n     **\n    \\*/\n    proto.svg = function (x, y, width, height, vbx, vby, vbw, vbh) {\n        var attrs = {};\n        if (is(x, \"object\") && y == null) {\n            attrs = x;\n        } else {\n            if (x != null) {\n                attrs.x = x;\n            }\n            if (y != null) {\n                attrs.y = y;\n            }\n            if (width != null) {\n                attrs.width = width;\n            }\n            if (height != null) {\n                attrs.height = height;\n            }\n            if (vbx != null && vby != null && vbw != null && vbh != null) {\n                attrs.viewBox = [vbx, vby, vbw, vbh];\n            }\n        }\n        return this.el(\"svg\", attrs);\n    };\n    /*\\\n     * Paper.mask\n     [ method ]\n     **\n     * Equivalent in behaviour to @Paper.g, except it’s a mask.\n     **\n     = (object) the `mask` element\n     **\n    \\*/\n    proto.mask = function (first) {\n        var attr,\n            el = this.el(\"mask\");\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ptrn\n     [ method ]\n     **\n     * Equivalent in behaviour to @Paper.g, except it’s a pattern.\n     - x (number) @optional X of the element\n     - y (number) @optional Y of the element\n     - width (number) @optional width of the element\n     - height (number) @optional height of the element\n     - vbx (number) @optional viewbox X\n     - vby (number) @optional viewbox Y\n     - vbw (number) @optional viewbox width\n     - vbh (number) @optional viewbox height\n     **\n     = (object) the `pattern` element\n     **\n    \\*/\n    proto.ptrn = function (x, y, width, height, vx, vy, vw, vh) {\n        if (is(x, \"object\")) {\n            var attr = x;\n        } else {\n            attr = {patternUnits: \"userSpaceOnUse\"};\n            if (x) {\n                attr.x = x;\n            }\n            if (y) {\n                attr.y = y;\n            }\n            if (width != null) {\n                attr.width = width;\n            }\n            if (height != null) {\n                attr.height = height;\n            }\n            if (vx != null && vy != null && vw != null && vh != null) {\n                attr.viewBox = [vx, vy, vw, vh];\n            } else {\n                attr.viewBox = [x || 0, y || 0, width || 0, height || 0];\n            }\n        }\n        return this.el(\"pattern\", attr);\n    };\n    /*\\\n     * Paper.use\n     [ method ]\n     **\n     * Creates a <use> element.\n     - id (string) @optional id of element to link\n     * or\n     - id (Element) @optional element to link\n     **\n     = (object) the `use` element\n     **\n    \\*/\n    proto.use = function (id) {\n        if (id != null) {\n            if (id instanceof Element) {\n                if (!id.attr(\"id\")) {\n                    id.attr({id: Snap._.id(id)});\n                }\n                id = id.attr(\"id\");\n            }\n            if (String(id).charAt() == \"#\") {\n                id = id.substring(1);\n            }\n            return this.el(\"use\", {\"xlink:href\": \"#\" + id});\n        } else {\n            return Element.prototype.use.call(this);\n        }\n    };\n    /*\\\n     * Paper.symbol\n     [ method ]\n     **\n     * Creates a <symbol> element.\n     - vbx (number) @optional viewbox X\n     - vby (number) @optional viewbox Y\n     - vbw (number) @optional viewbox width\n     - vbh (number) @optional viewbox height\n     = (object) the `symbol` element\n     **\n    \\*/\n    proto.symbol = function (vx, vy, vw, vh) {\n        var attr = {};\n        if (vx != null && vy != null && vw != null && vh != null) {\n            attr.viewBox = [vx, vy, vw, vh];\n        }\n\n        return this.el(\"symbol\", attr);\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string|array) The text string to draw or array of strings to nest within separate `<tspan>` elements\n     = (object) the `text` element\n     **\n     > Usage\n     | var t1 = paper.text(50, 50, \"Snap\");\n     | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n     | // Text path usage\n     | t1.attr({textpath: \"M10,10L100,100\"});\n     | // or\n     | var pth = paper.path(\"M10,10L100,100\");\n     | t1.attr({textpath: pth});\n    \\*/\n    proto.text = function (x, y, text) {\n        var attr = {};\n        if (is(x, \"object\")) {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                text: text || \"\"\n            };\n        }\n        return this.el(\"text\", attr);\n    };\n    /*\\\n     * Paper.line\n     [ method ]\n     **\n     * Draws a line\n     **\n     - x1 (number) x coordinate position of the start\n     - y1 (number) y coordinate position of the start\n     - x2 (number) x coordinate position of the end\n     - y2 (number) y coordinate position of the end\n     = (object) the `line` element\n     **\n     > Usage\n     | var t1 = paper.line(50, 50, 100, 100);\n    \\*/\n    proto.line = function (x1, y1, x2, y2) {\n        var attr = {};\n        if (is(x1, \"object\")) {\n            attr = x1;\n        } else if (x1 != null) {\n            attr = {\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            };\n        }\n        return this.el(\"line\", attr);\n    };\n    /*\\\n     * Paper.polyline\n     [ method ]\n     **\n     * Draws a polyline\n     **\n     - points (array) array of points\n     * or\n     - varargs (…) points\n     = (object) the `polyline` element\n     **\n     > Usage\n     | var p1 = paper.polyline([10, 10, 100, 100]);\n     | var p2 = paper.polyline(10, 10, 100, 100);\n    \\*/\n    proto.polyline = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var attr = {};\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            attr = points;\n        } else if (points != null) {\n            attr = {points: points};\n        }\n        return this.el(\"polyline\", attr);\n    };\n    /*\\\n     * Paper.polygon\n     [ method ]\n     **\n     * Draws a polygon. See @Paper.polyline\n    \\*/\n    proto.polygon = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var attr = {};\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            attr = points;\n        } else if (points != null) {\n            attr = {points: points};\n        }\n        return this.el(\"polygon\", attr);\n    };\n    // gradients\n    (function () {\n        var $ = Snap._.$;\n        // gradients' helpers\n        /*\\\n         * Element.stops\n         [ method ]\n         **\n         * Only for gradients!\n         * Returns array of gradient stops elements.\n         = (array) the stops array.\n        \\*/\n        function Gstops() {\n            return this.selectAll(\"stop\");\n        }\n        /*\\\n         * Element.addStop\n         [ method ]\n         **\n         * Only for gradients!\n         * Adds another stop to the gradient.\n         - color (string) stops color\n         - offset (number) stops offset 0..100\n         = (object) gradient element\n        \\*/\n        function GaddStop(color, offset) {\n            var stop = $(\"stop\"),\n                attr = {\n                    offset: +offset + \"%\"\n                };\n            color = Snap.color(color);\n            attr[\"stop-color\"] = color.hex;\n            if (color.opacity < 1) {\n                attr[\"stop-opacity\"] = color.opacity;\n            }\n            $(stop, attr);\n            var stops = this.stops(),\n                inserted;\n            for (var i = 0; i < stops.length; i++) {\n                var stopOffset = parseFloat(stops[i].attr(\"offset\"));\n                if (stopOffset > offset) {\n                    this.node.insertBefore(stop, stops[i].node);\n                    inserted = true;\n                    break;\n                }\n            }\n            if (!inserted) {\n                this.node.appendChild(stop);\n            }\n            return this;\n        }\n        function GgetBBox() {\n            if (this.type == \"linearGradient\") {\n                var x1 = $(this.node, \"x1\") || 0,\n                    x2 = $(this.node, \"x2\") || 1,\n                    y1 = $(this.node, \"y1\") || 0,\n                    y2 = $(this.node, \"y2\") || 0;\n                return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n            } else {\n                var cx = this.node.cx || .5,\n                    cy = this.node.cy || .5,\n                    r = this.node.r || 0;\n                return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n            }\n        }\n        /*\\\n         * Element.setStops\n         [ method ]\n         **\n         * Only for gradients!\n         * Updates stops of the gradient based on passed gradient descriptor. See @Ppaer.gradient\n         - str (string) gradient descriptor part after `()`.\n         = (object) gradient element\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         | g.setStops(\"#fff-#000-#f00-#fc0\");\n        \\*/\n        function GsetStops(str) {\n            var grad = str,\n                stops = this.stops();\n            if (typeof str == \"string\") {\n                grad = eve(\"snap.util.grad.parse\", null, \"l(0,0,0,1)\" + str).firstDefined().stops;\n            }\n            if (!Snap.is(grad, \"array\")) {\n                return;\n            }\n            for (var i = 0; i < stops.length; i++) {\n                if (grad[i]) {\n                    var color = Snap.color(grad[i].color),\n                        attr = {\"offset\": grad[i].offset + \"%\"};\n                    attr[\"stop-color\"] = color.hex;\n                    if (color.opacity < 1) {\n                        attr[\"stop-opacity\"] = color.opacity;\n                    }\n                    stops[i].attr(attr);\n                } else {\n                    stops[i].remove();\n                }\n            }\n            for (i = stops.length; i < grad.length; i++) {\n                this.addStop(grad[i].color, grad[i].offset);\n            }\n            return this;\n        }\n        function gradient(defs, str) {\n            var grad = eve(\"snap.util.grad.parse\", null, str).firstDefined(),\n                el;\n            if (!grad) {\n                return null;\n            }\n            grad.params.unshift(defs);\n            if (grad.type.toLowerCase() == \"l\") {\n                el = gradientLinear.apply(0, grad.params);\n            } else {\n                el = gradientRadial.apply(0, grad.params);\n            }\n            if (grad.type != grad.type.toLowerCase()) {\n                $(el.node, {\n                    gradientUnits: \"userSpaceOnUse\"\n                });\n            }\n            var stops = grad.stops,\n                len = stops.length;\n            for (var i = 0; i < len; i++) {\n                var stop = stops[i];\n                el.addStop(stop.color, stop.offset);\n            }\n            return el;\n        }\n        function gradientLinear(defs, x1, y1, x2, y2) {\n            var el = Snap._.make(\"linearGradient\", defs);\n            el.stops = Gstops;\n            el.addStop = GaddStop;\n            el.getBBox = GgetBBox;\n            el.setStops = GsetStops;\n            if (x1 != null) {\n                $(el.node, {\n                    x1: x1,\n                    y1: y1,\n                    x2: x2,\n                    y2: y2\n                });\n            }\n            return el;\n        }\n        function gradientRadial(defs, cx, cy, r, fx, fy) {\n            var el = Snap._.make(\"radialGradient\", defs);\n            el.stops = Gstops;\n            el.addStop = GaddStop;\n            el.getBBox = GgetBBox;\n            if (cx != null) {\n                $(el.node, {\n                    cx: cx,\n                    cy: cy,\n                    r: r\n                });\n            }\n            if (fx != null && fy != null) {\n                $(el.node, {\n                    fx: fx,\n                    fy: fy\n                });\n            }\n            return el;\n        }\n        /*\\\n         * Paper.gradient\n         [ method ]\n         **\n         * Creates a gradient element\n         **\n         - gradient (string) gradient descriptor\n         > Gradient Descriptor\n         * The gradient descriptor is an expression formatted as\n         * follows: `<type>(<coords>)<colors>`.  The `<type>` can be\n         * either linear or radial.  The uppercase `L` or `R` letters\n         * indicate absolute coordinates offset from the SVG surface.\n         * Lowercase `l` or `r` letters indicate coordinates\n         * calculated relative to the element to which the gradient is\n         * applied.  Coordinates specify a linear gradient vector as\n         * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n         * `r` and optional `fx`, `fy` specifying a focal point away\n         * from the center of the circle. Specify `<colors>` as a list\n         * of dash-separated CSS color values.  Each color may be\n         * followed by a custom offset value, separated with a colon\n         * character.\n         > Examples\n         * Linear gradient, relative from top-left corner to bottom-right\n         * corner, from black through red to white:\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         * Linear gradient, absolute from (0, 0) to (100, 100), from black\n         * through red at 25% to white:\n         | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25-#fff\");\n         * Radial gradient, relative from the center of the element with radius\n         * half the width, from black to white:\n         | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n         * To apply the gradient:\n         | paper.circle(50, 50, 40).attr({\n         |     fill: g\n         | });\n         = (object) the `gradient` element\n        \\*/\n        proto.gradient = function (str) {\n            return gradient(this.defs, str);\n        };\n        proto.gradientLinear = function (x1, y1, x2, y2) {\n            return gradientLinear(this.defs, x1, y1, x2, y2);\n        };\n        proto.gradientRadial = function (cx, cy, r, fx, fy) {\n            return gradientRadial(this.defs, cx, cy, r, fx, fy);\n        };\n        /*\\\n         * Paper.toString\n         [ method ]\n         **\n         * Returns SVG code for the @Paper\n         = (string) SVG code for the @Paper\n        \\*/\n        proto.toString = function () {\n            var doc = this.node.ownerDocument,\n                f = doc.createDocumentFragment(),\n                d = doc.createElement(\"div\"),\n                svg = this.node.cloneNode(true),\n                res;\n            f.appendChild(d);\n            d.appendChild(svg);\n            Snap._.$(svg, {xmlns: \"http://www.w3.org/2000/svg\"});\n            res = d.innerHTML;\n            f.removeChild(f.firstChild);\n            return res;\n        };\n        /*\\\n         * Paper.toDataURL\n         [ method ]\n         **\n         * Returns SVG code for the @Paper as Data URI string.\n         = (string) Data URI string\n        \\*/\n        proto.toDataURL = function () {\n            if (window && window.btoa) {\n                return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(this)));\n            }\n        };\n        /*\\\n         * Paper.clear\n         [ method ]\n         **\n         * Removes all child nodes of the paper, except <defs>.\n        \\*/\n        proto.clear = function () {\n            var node = this.node.firstChild,\n                next;\n            while (node) {\n                next = node.nextSibling;\n                if (node.tagName != \"defs\") {\n                    node.parentNode.removeChild(node);\n                } else {\n                    proto.clear.call({node: node});\n                }\n                node = next;\n            }\n        };\n    }());\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        clone = Snap._.clone,\n        has = \"hasOwnProperty\",\n        p2s = /,?([a-z]),?/gi,\n        toFloat = parseFloat,\n        math = Math,\n        PI = math.PI,\n        mmin = math.min,\n        mmax = math.max,\n        pow = math.pow,\n        abs = math.abs;\n    function paths(ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    }\n    function box(x, y, width, height) {\n        if (x == null) {\n            x = y = width = height = 0;\n        }\n        if (y == null) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        return {\n            x: x,\n            y: y,\n            width: width,\n            w: width,\n            height: height,\n            h: height,\n            x2: x + width,\n            y2: y + height,\n            cx: x + width / 2,\n            cy: y + height / 2,\n            r1: math.min(width, height) / 2,\n            r2: math.max(width, height) / 2,\n            r0: math.sqrt(width * width + height * height) / 2,\n            path: rectPath(x, y, width, height),\n            vb: [x, y, width, height].join(\" \")\n        };\n    }\n    function toString() {\n        return this.join(\",\").replace(p2s, \"$1\");\n    }\n    function pathClone(pathArray) {\n        var res = clone(pathArray);\n        res.toString = toString;\n        return res;\n    }\n    function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n                getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    }\n    function getLengthFactory(istotal, subpath) {\n        function O(val) {\n            return +(+val).toFixed(3);\n        }\n        return Snap._.cacher(function (path, length, onlystart) {\n            if (path instanceof Element) {\n                path = path.attr(\"d\");\n            }\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\n                                \"C\" + O(point.start.x),\n                                O(point.start.y),\n                                O(point.m.x),\n                                O(point.m.y),\n                                O(point.x),\n                                O(point.y)\n                            ];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\n                                \"M\" + O(point.x),\n                                O(point.y) + \"C\" + O(point.n.x),\n                                O(point.n.y),\n                                O(point.end.x),\n                                O(point.end.y),\n                                O(p[5]),\n                                O(p[6])\n                            ].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return point;\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            return point;\n        }, null, Snap._.clone);\n    }\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = 90 - math.atan2(mx - nx, my - ny) * 180 / PI;\n        // (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    }\n    function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!Snap.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return box(\n            bbox.min.x,\n            bbox.min.y,\n            bbox.max.x - bbox.min.x,\n            bbox.max.y - bbox.min.y\n        );\n    }\n    function isPointInsideBBox(bbox, x, y) {\n        return  x >= bbox.x &&\n                x <= bbox.x + bbox.width &&\n                y >= bbox.y &&\n                y <= bbox.y + bbox.height;\n    }\n    function isBBoxIntersect(bbox1, bbox2) {\n        bbox1 = box(bbox1);\n        bbox2 = box(bbox2);\n        return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n                || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n                || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    }\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = bezierBBox(bez1),\n            bbox2 = bezierBBox(bez2);\n        if (!isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = ~~(l1 / 8),\n            n2 = ~~(l2 / 8),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: t1,\n                                t2: t2\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function pathIntersection(path1, path2) {\n        return interPathHelper(path1, path2);\n    }\n    function pathIntersectionNumber(path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    }\n    function interPathHelper(path1, path2, justCount) {\n        path1 = path2curve(path1);\n        path2 = path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function isPointInsidePath(path, x, y) {\n        var bbox = pathBBox(path);\n        return isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    }\n    function pathBBox(path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return box();\n        }\n        path = path2curve(path);\n        var x = 0,\n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X.concat(dim.min.x, dim.max.x);\n                Y = Y.concat(dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin.apply(0, X),\n            ymin = mmin.apply(0, Y),\n            xmax = mmax.apply(0, X),\n            ymax = mmax.apply(0, Y),\n            bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n        pth.bbox = clone(bb);\n        return bb;\n    }\n    function rectPath(x, y, w, h, r) {\n        if (r) {\n            return [\n                [\"M\", +x + +r, y],\n                [\"l\", w - r * 2, 0],\n                [\"a\", r, r, 0, 0, 1, r, r],\n                [\"l\", 0, h - r * 2],\n                [\"a\", r, r, 0, 0, 1, -r, r],\n                [\"l\", r * 2 - w, 0],\n                [\"a\", r, r, 0, 0, 1, -r, -r],\n                [\"l\", 0, r * 2 - h],\n                [\"a\", r, r, 0, 0, 1, r, -r],\n                [\"z\"]\n            ];\n        }\n        var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        res.toString = toString;\n        return res;\n    }\n    function ellipsePath(x, y, rx, ry, a) {\n        if (a == null && ry == null) {\n            ry = rx;\n        }\n        x = +x;\n        y = +y;\n        rx = +rx;\n        ry = +ry;\n        if (a != null) {\n            var rad = Math.PI / 180,\n                x1 = x + rx * Math.cos(-ry * rad),\n                x2 = x + rx * Math.cos(-a * rad),\n                y1 = y + rx * Math.sin(-ry * rad),\n                y2 = y + rx * Math.sin(-a * rad),\n                res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n        } else {\n            res = [\n                [\"M\", x, y],\n                [\"m\", 0, -ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n                [\"z\"]\n            ];\n        }\n        res.toString = toString;\n        return res;\n    }\n    var unit2px = Snap._unit2px,\n        getPath = {\n        path: function (el) {\n            return el.attr(\"path\");\n        },\n        circle: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.r);\n        },\n        ellipse: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx || 0, attr.cy || 0, attr.rx, attr.ry);\n        },\n        rect: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height, attr.rx, attr.ry);\n        },\n        image: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height);\n        },\n        line: function (el) {\n            return \"M\" + [el.attr(\"x1\") || 0, el.attr(\"y1\") || 0, el.attr(\"x2\"), el.attr(\"y2\")];\n        },\n        polyline: function (el) {\n            return \"M\" + el.attr(\"points\");\n        },\n        polygon: function (el) {\n            return \"M\" + el.attr(\"points\") + \"z\";\n        },\n        deflt: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        }\n    };\n    function pathToRelative(pathArray) {\n        var pth = paths(pathArray),\n            lowerCase = String.prototype.toLowerCase;\n        if (pth.rel) {\n            return pathClone(pth.rel);\n        }\n        if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0;\n        if (pathArray[0][0] == \"M\") {\n            x = pathArray[0][1];\n            y = pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res.push([\"M\", x, y]);\n        }\n        for (var i = start, ii = pathArray.length; i < ii; i++) {\n            var r = res[i] = [],\n                pa = pathArray[i];\n            if (pa[0] != lowerCase.call(pa[0])) {\n                r[0] = lowerCase.call(pa[0]);\n                switch (r[0]) {\n                    case \"a\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] - x).toFixed(3);\n                        r[7] = +(pa[7] - y).toFixed(3);\n                        break;\n                    case \"v\":\n                        r[1] = +(pa[1] - y).toFixed(3);\n                        break;\n                    case \"m\":\n                        mx = pa[1];\n                        my = pa[2];\n                    default:\n                        for (var j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +(pa[j] - (j % 2 ? x : y)).toFixed(3);\n                        }\n                }\n            } else {\n                r = res[i] = [];\n                if (pa[0] == \"m\") {\n                    mx = pa[1] + x;\n                    my = pa[2] + y;\n                }\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    res[i][k] = pa[k];\n                }\n            }\n            var len = res[i].length;\n            switch (res[i][0]) {\n                case \"z\":\n                    x = mx;\n                    y = my;\n                    break;\n                case \"h\":\n                    x += +res[i][len - 1];\n                    break;\n                case \"v\":\n                    y += +res[i][len - 1];\n                    break;\n                default:\n                    x += +res[i][len - 2];\n                    y += +res[i][len - 1];\n            }\n        }\n        res.toString = toString;\n        pth.rel = pathClone(res);\n        return res;\n    }\n    function pathToAbsolute(pathArray) {\n        var pth = paths(pathArray);\n        if (pth.abs) {\n            return pathClone(pth.abs);\n        }\n        if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        if (!pathArray || !pathArray.length) {\n            return [[\"M\", 0, 0]];\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0,\n            pa0;\n        if (pathArray[0][0] == \"M\") {\n            x = +pathArray[0][1];\n            y = +pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res[0] = [\"M\", x, y];\n        }\n        var crz = pathArray.length == 3 &&\n            pathArray[0][0] == \"M\" &&\n            pathArray[1][0].toUpperCase() == \"R\" &&\n            pathArray[2][0].toUpperCase() == \"Z\";\n        for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n            res.push(r = []);\n            pa = pathArray[i];\n            pa0 = pa[0];\n            if (pa0 != pa0.toUpperCase()) {\n                r[0] = pa0.toUpperCase();\n                switch (r[0]) {\n                    case \"A\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +pa[6] + x;\n                        r[7] = +pa[7] + y;\n                        break;\n                    case \"V\":\n                        r[1] = +pa[1] + y;\n                        break;\n                    case \"H\":\n                        r[1] = +pa[1] + x;\n                        break;\n                    case \"R\":\n                        var dots = [x, y].concat(pa.slice(1));\n                        for (var j = 2, jj = dots.length; j < jj; j++) {\n                            dots[j] = +dots[j] + x;\n                            dots[++j] = +dots[j] + y;\n                        }\n                        res.pop();\n                        res = res.concat(catmullRom2bezier(dots, crz));\n                        break;\n                    case \"O\":\n                        res.pop();\n                        dots = ellipsePath(x, y, pa[1], pa[2]);\n                        dots.push(dots[0]);\n                        res = res.concat(dots);\n                        break;\n                    case \"U\":\n                        res.pop();\n                        res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                        r = [\"U\"].concat(res[res.length - 1].slice(-2));\n                        break;\n                    case \"M\":\n                        mx = +pa[1] + x;\n                        my = +pa[2] + y;\n                    default:\n                        for (j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +pa[j] + (j % 2 ? x : y);\n                        }\n                }\n            } else if (pa0 == \"R\") {\n                dots = [x, y].concat(pa.slice(1));\n                res.pop();\n                res = res.concat(catmullRom2bezier(dots, crz));\n                r = [\"R\"].concat(pa.slice(-2));\n            } else if (pa0 == \"O\") {\n                res.pop();\n                dots = ellipsePath(x, y, pa[1], pa[2]);\n                dots.push(dots[0]);\n                res = res.concat(dots);\n            } else if (pa0 == \"U\") {\n                res.pop();\n                res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                r = [\"U\"].concat(res[res.length - 1].slice(-2));\n            } else {\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    r[k] = pa[k];\n                }\n            }\n            pa0 = pa0.toUpperCase();\n            if (pa0 != \"O\") {\n                switch (r[0]) {\n                    case \"Z\":\n                        x = +mx;\n                        y = +my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n        }\n        res.toString = toString;\n        pth.abs = pathClone(res);\n        return res;\n    }\n    function l2c(x1, y1, x2, y2) {\n        return [x1, y1, x2, y2, x2, y2];\n    }\n    function q2c(x1, y1, ax, ay, x2, y2) {\n        var _13 = 1 / 3,\n            _23 = 2 / 3;\n        return [\n                _13 * x1 + _23 * ax,\n                _13 * y1 + _23 * ay,\n                _13 * x2 + _23 * ax,\n                _13 * y2 + _23 * ay,\n                x2,\n                y2\n            ];\n    }\n    function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n        // for more information of where this math came from visit:\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        var _120 = PI * 120 / 180,\n            rad = PI / 180 * (+angle || 0),\n            res = [],\n            xy,\n            rotate = Snap._.cacher(function (x, y, rad) {\n                var X = x * math.cos(rad) - y * math.sin(rad),\n                    Y = x * math.sin(rad) + y * math.cos(rad);\n                return {x: X, y: Y};\n            });\n        if (!rx || !ry) {\n            return [x1, y1, x2, y2, x2, y2];\n        }\n        if (!recursive) {\n            xy = rotate(x1, y1, -rad);\n            x1 = xy.x;\n            y1 = xy.y;\n            xy = rotate(x2, y2, -rad);\n            x2 = xy.x;\n            y2 = xy.y;\n            var cos = math.cos(PI / 180 * angle),\n                sin = math.sin(PI / 180 * angle),\n                x = (x1 - x2) / 2,\n                y = (y1 - y2) / 2;\n            var h = x * x / (rx * rx) + y * y / (ry * ry);\n            if (h > 1) {\n                h = math.sqrt(h);\n                rx = h * rx;\n                ry = h * ry;\n            }\n            var rx2 = rx * rx,\n                ry2 = ry * ry,\n                k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                    math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                cx = k * rx * y / ry + (x1 + x2) / 2,\n                cy = k * -ry * x / rx + (y1 + y2) / 2,\n                f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n            f1 = x1 < cx ? PI - f1 : f1;\n            f2 = x2 < cx ? PI - f2 : f2;\n            f1 < 0 && (f1 = PI * 2 + f1);\n            f2 < 0 && (f2 = PI * 2 + f2);\n            if (sweep_flag && f1 > f2) {\n                f1 = f1 - PI * 2;\n            }\n            if (!sweep_flag && f2 > f1) {\n                f2 = f2 - PI * 2;\n            }\n        } else {\n            f1 = recursive[0];\n            f2 = recursive[1];\n            cx = recursive[2];\n            cy = recursive[3];\n        }\n        var df = f2 - f1;\n        if (abs(df) > _120) {\n            var f2old = f2,\n                x2old = x2,\n                y2old = y2;\n            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n            x2 = cx + rx * math.cos(f2);\n            y2 = cy + ry * math.sin(f2);\n            res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n        }\n        df = f2 - f1;\n        var c1 = math.cos(f1),\n            s1 = math.sin(f1),\n            c2 = math.cos(f2),\n            s2 = math.sin(f2),\n            t = math.tan(df / 4),\n            hx = 4 / 3 * rx * t,\n            hy = 4 / 3 * ry * t,\n            m1 = [x1, y1],\n            m2 = [x1 + hx * s1, y1 - hy * c1],\n            m3 = [x2 + hx * s2, y2 - hy * c2],\n            m4 = [x2, y2];\n        m2[0] = 2 * m1[0] - m2[0];\n        m2[1] = 2 * m1[1] - m2[1];\n        if (recursive) {\n            return [m2, m3, m4].concat(res);\n        } else {\n            res = [m2, m3, m4].concat(res).join().split(\",\");\n            var newres = [];\n            for (var i = 0, ii = res.length; i < ii; i++) {\n                newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n            }\n            return newres;\n        }\n    }\n    function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t;\n        return {\n            x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n            y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n        };\n    }\n\n    // Returns bounding box of cubic bezier curve.\n    // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n    // Original version: NISHIO Hirokazu\n    // Modifications: https://github.com/timo22345\n    function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) {\n        var tvalues = [],\n            bounds = [[], []],\n            a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n        for (var i = 0; i < 2; ++i) {\n            if (i == 0) {\n                b = 6 * x0 - 12 * x1 + 6 * x2;\n                a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n                c = 3 * x1 - 3 * x0;\n            } else {\n                b = 6 * y0 - 12 * y1 + 6 * y2;\n                a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n                c = 3 * y1 - 3 * y0;\n            }\n            if (abs(a) < 1e-12) {\n                if (abs(b) < 1e-12) {\n                    continue;\n                }\n                t = -c / b;\n                if (0 < t && t < 1) {\n                    tvalues.push(t);\n                }\n                continue;\n            }\n            b2ac = b * b - 4 * c * a;\n            sqrtb2ac = math.sqrt(b2ac);\n            if (b2ac < 0) {\n                continue;\n            }\n            t1 = (-b + sqrtb2ac) / (2 * a);\n            if (0 < t1 && t1 < 1) {\n                tvalues.push(t1);\n            }\n            t2 = (-b - sqrtb2ac) / (2 * a);\n            if (0 < t2 && t2 < 1) {\n                tvalues.push(t2);\n            }\n        }\n\n        var x, y, j = tvalues.length,\n            jlen = j,\n            mt;\n        while (j--) {\n            t = tvalues[j];\n            mt = 1 - t;\n            bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3;\n            bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3;\n        }\n\n        bounds[0][jlen] = x0;\n        bounds[1][jlen] = y0;\n        bounds[0][jlen + 1] = x3;\n        bounds[1][jlen + 1] = y3;\n        bounds[0].length = bounds[1].length = jlen + 2;\n\n\n        return {\n          min: {x: mmin.apply(0, bounds[0]), y: mmin.apply(0, bounds[1])},\n          max: {x: mmax.apply(0, bounds[0]), y: mmax.apply(0, bounds[1])}\n        };\n    }\n\n    function path2curve(path, path2) {\n        var pth = !path2 && paths(path);\n        if (!path2 && pth.curve) {\n            return pathClone(pth.curve);\n        }\n        var p = pathToAbsolute(path),\n            p2 = path2 && pathToAbsolute(path2),\n            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            processPath = function (path, d, pcom) {\n                var nx, ny;\n                if (!path) {\n                    return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                }\n                !(path[0] in {T: 1, Q: 1}) && (d.qx = d.qy = null);\n                switch (path[0]) {\n                    case \"M\":\n                        d.X = path[1];\n                        d.Y = path[2];\n                        break;\n                    case \"A\":\n                        path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n                        break;\n                    case \"S\":\n                        if (pcom == \"C\" || pcom == \"S\") { // In \"S\" case we have to take into account, if the previous command is C/S.\n                            nx = d.x * 2 - d.bx;          // And reflect the previous\n                            ny = d.y * 2 - d.by;          // command's control point relative to the current point.\n                        }\n                        else {                            // or some else or nothing\n                            nx = d.x;\n                            ny = d.y;\n                        }\n                        path = [\"C\", nx, ny].concat(path.slice(1));\n                        break;\n                    case \"T\":\n                        if (pcom == \"Q\" || pcom == \"T\") { // In \"T\" case we have to take into account, if the previous command is Q/T.\n                            d.qx = d.x * 2 - d.qx;        // And make a reflection similar\n                            d.qy = d.y * 2 - d.qy;        // to case \"S\".\n                        }\n                        else {                            // or something else or nothing\n                            d.qx = d.x;\n                            d.qy = d.y;\n                        }\n                        path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                        break;\n                    case \"Q\":\n                        d.qx = path[1];\n                        d.qy = path[2];\n                        path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                        break;\n                    case \"L\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n                        break;\n                    case \"H\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n                        break;\n                    case \"V\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n                        break;\n                    case \"Z\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n                        break;\n                }\n                return path;\n            },\n            fixArc = function (pp, i) {\n                if (pp[i].length > 7) {\n                    pp[i].shift();\n                    var pi = pp[i];\n                    while (pi.length) {\n                        pcoms1[i] = \"A\"; // if created multiple C:s, their original seg is saved\n                        p2 && (pcoms2[i] = \"A\"); // the same as above\n                        pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n                    }\n                    pp.splice(i, 1);\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            fixM = function (path1, path2, a1, a2, i) {\n                if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                    path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                    a1.bx = 0;\n                    a1.by = 0;\n                    a1.x = path1[i][1];\n                    a1.y = path1[i][2];\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            pcoms1 = [], // path commands of original path p\n            pcoms2 = [], // path commands of original path p2\n            pfirst = \"\", // temporary holder for original path command\n            pcom = \"\"; // holder for previous path command of original path\n        for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n            p[i] && (pfirst = p[i][0]); // save current path command\n\n            if (pfirst != \"C\") // C is not saved yet, because it may be result of conversion\n            {\n                pcoms1[i] = pfirst; // Save current path command\n                i && ( pcom = pcoms1[i - 1]); // Get previous path command pcom\n            }\n            p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n\n            if (pcoms1[i] != \"A\" && pfirst == \"C\") pcoms1[i] = \"C\"; // A is the only command\n            // which may produce multiple C:s\n            // so we have to make sure that C is also C in original path\n\n            fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n\n            if (p2) { // the same procedures is done to p2\n                p2[i] && (pfirst = p2[i][0]);\n                if (pfirst != \"C\") {\n                    pcoms2[i] = pfirst;\n                    i && (pcom = pcoms2[i - 1]);\n                }\n                p2[i] = processPath(p2[i], attrs2, pcom);\n\n                if (pcoms2[i] != \"A\" && pfirst == \"C\") {\n                    pcoms2[i] = \"C\";\n                }\n\n                fixArc(p2, i);\n            }\n            fixM(p, p2, attrs, attrs2, i);\n            fixM(p2, p, attrs2, attrs, i);\n            var seg = p[i],\n                seg2 = p2 && p2[i],\n                seglen = seg.length,\n                seg2len = p2 && seg2.length;\n            attrs.x = seg[seglen - 2];\n            attrs.y = seg[seglen - 1];\n            attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n            attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n            attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n            attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n            attrs2.x = p2 && seg2[seg2len - 2];\n            attrs2.y = p2 && seg2[seg2len - 1];\n        }\n        if (!p2) {\n            pth.curve = pathClone(p);\n        }\n        return p2 ? [p, p2] : p;\n    }\n    function mapPath(path, matrix) {\n        if (!matrix) {\n            return path;\n        }\n        var x, y, i, j, ii, jj, pathi;\n        path = path2curve(path);\n        for (i = 0, ii = path.length; i < ii; i++) {\n            pathi = path[i];\n            for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                x = matrix.x(pathi[j], pathi[j + 1]);\n                y = matrix.y(pathi[j], pathi[j + 1]);\n                pathi[j] = x;\n                pathi[j + 1] = y;\n            }\n        }\n        return path;\n    }\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n\n    // export\n    Snap.path = paths;\n\n    /*\\\n     * Snap.path.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the given path in pixels\n     **\n     - path (string) SVG path string\n     **\n     = (number) length\n    \\*/\n    Snap.path.getTotalLength = getTotalLength;\n    /*\\\n     * Snap.path.getPointAtLength\n     [ method ]\n     **\n     * Returns the coordinates of the point located at the given length along the given path\n     **\n     - path (string) SVG path string\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    Snap.path.getPointAtLength = getPointAtLength;\n    /*\\\n     * Snap.path.getSubpath\n     [ method ]\n     **\n     * Returns the subpath of a given path between given start and end lengths\n     **\n     - path (string) SVG path string\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    Snap.path.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the path in pixels (only works for `path` elements)\n     = (number) length\n    \\*/\n    elproto.getTotalLength = function () {\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n    };\n    // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a <path> is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n     **\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        return getPointAtLength(this.attr(\"d\"), length);\n    };\n    // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n     **\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n    };\n    Snap._.box = box;\n    /*\\\n     * Snap.path.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds dot coordinates on the given cubic beziér curve at the given t\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point,\n     o     y: (number) y coordinate of the point,\n     o     m: {\n     o         x: (number) x coordinate of the left anchor,\n     o         y: (number) y coordinate of the left anchor\n     o     },\n     o     n: {\n     o         x: (number) x coordinate of the right anchor,\n     o         y: (number) y coordinate of the right anchor\n     o     },\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve,\n     o         y: (number) y coordinate of the start of the curve\n     o     },\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve,\n     o         y: (number) y coordinate of the end of the curve\n     o     },\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    Snap.path.findDotsAtSegment = findDotsAtSegment;\n    /*\\\n     * Snap.path.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given cubic beziér curve\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for beziér curve\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.bezierBBox = bezierBBox;\n    /*\\\n     * Snap.path.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding box\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point is inside\n    \\*/\n    Snap.path.isPointInsideBBox = isPointInsideBBox;\n    Snap.closest = function (x, y, X, Y) {\n        var r = 100,\n            b = box(x - r / 2, y - r / 2, r, r),\n            inside = [],\n            getter = X[0].hasOwnProperty(\"x\") ? function (i) {\n                return {\n                    x: X[i].x,\n                    y: X[i].y\n                };\n            } : function (i) {\n                return {\n                    x: X[i],\n                    y: Y[i]\n                };\n            },\n            found = 0;\n        while (r <= 1e6 && !found) {\n            for (var i = 0, ii = X.length; i < ii; i++) {\n                var xy = getter(i);\n                if (isPointInsideBBox(b, xy.x, xy.y)) {\n                    found++;\n                    inside.push(xy);\n                    break;\n                }\n            }\n            if (!found) {\n                r *= 2;\n                b = box(x - r / 2, y - r / 2, r, r)\n            }\n        }\n        if (r == 1e6) {\n            return;\n        }\n        var len = Infinity,\n            res;\n        for (i = 0, ii = inside.length; i < ii; i++) {\n            var l = Snap.len(x, y, inside[i].x, inside[i].y);\n            if (len > l) {\n                len = l;\n                inside[i].len = l;\n                res = inside[i];\n            }\n        }\n        return res;\n    };\n    /*\\\n     * Snap.path.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if bounding boxes intersect\n    \\*/\n    Snap.path.isBBoxIntersect = isBBoxIntersect;\n    /*\\\n     * Snap.path.intersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point,\n     o         y: (number) y coordinate of the point,\n     o         t1: (number) t value for segment of path1,\n     o         t2: (number) t value for segment of path2,\n     o         segment1: (number) order number for segment of path1,\n     o         segment2: (number) order number for segment of path2,\n     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    Snap.path.intersection = pathIntersection;\n    Snap.path.intersectionNumber = pathIntersectionNumber;\n    /*\\\n     * Snap.path.isPointInside\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     *\n     * Note: fill mode doesn’t affect the result of this method.\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) `true` if point is inside the path\n    \\*/\n    Snap.path.isPointInside = isPointInsidePath;\n    /*\\\n     * Snap.path.getBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given path\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.getBBox = pathBBox;\n    Snap.path.get = getPath;\n    /*\\\n     * Snap.path.toRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into relative values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toRelative = pathToRelative;\n    /*\\\n     * Snap.path.toAbsolute\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into absolute values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toAbsolute = pathToAbsolute;\n    /*\\\n     * Snap.path.toCubic\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic beziér curves\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments\n    \\*/\n    Snap.path.toCubic = path2curve;\n    /*\\\n     * Snap.path.map\n     [ method ]\n     **\n     * Transform the path string with the given matrix\n     - path (string) path string\n     - matrix (object) see @Matrix\n     = (string) transformed path string\n    \\*/\n    Snap.path.map = mapPath;\n    Snap.path.toString = toString;\n    Snap.path.clone = pathClone;\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var mmax = Math.max,\n        mmin = Math.min;\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n\tthis.bindings = {};\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i]) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set\n     *\n     * If the function returns `false`, the loop stops running.\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.animate\n     [ method ]\n     **\n     * Animates each element in set in sync.\n     *\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     * or\n     - animation (array) array of animation parameter for each element in set in format `[attrs, duration, easing, callback]`\n     > Usage\n     | // animate all elements in set to radius 10\n     | set.animate({r: 10}, 500, mina.easein);\n     | // or\n     | // animate first element to radius 10, but second to radius 20 and in different time\n     | set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);\n     = (Element) the current element\n    \\*/\n    setproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Snap._.Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = easing.dur;\n            attrs = attrs.attr;\n        }\n        var args = arguments;\n        if (Snap.is(attrs, \"array\") && Snap.is(args[args.length - 1], \"array\")) {\n            var each = true;\n        }\n        var begin,\n            handler = function () {\n                if (begin) {\n                    this.b = begin;\n                } else {\n                    begin = this.b;\n                }\n            },\n            cb = 0,\n            set = this,\n            callbacker = callback && function () {\n                if (++cb == set.length) {\n                    callback.call(this);\n                }\n            };\n        return this.forEach(function (el, i) {\n            eve.once(\"snap.animcreated.\" + el.id, handler);\n            if (each) {\n                args[i] && el.animate.apply(el, args[i]);\n            } else {\n                el.animate(attrs, ms, easing, callbacker);\n            }\n        });\n    };\n    /*\\\n     * Set.remove\n     [ method ]\n     **\n     * Removes all children of the set.\n     *\n     = (object) Set object\n    \\*/\n    setproto.remove = function () {\n        while (this.length) {\n            this.pop().remove();\n        }\n        return this;\n    };\n    /*\\\n     * Set.bind\n     [ method ]\n     **\n     * Specifies how to handle a specific attribute when applied\n     * to a set.\n     *\n     **\n     - attr (string) attribute name\n     - callback (function) function to run\n     * or\n     - attr (string) attribute name\n     - element (Element) specific element in the set to apply the attribute to\n     * or\n     - attr (string) attribute name\n     - element (Element) specific element in the set to apply the attribute to\n     - eattr (string) attribute on the element to bind the attribute to\n     = (object) Set object\n    \\*/\n    setproto.bind = function (attr, a, b) {\n        var data = {};\n        if (typeof a == \"function\") {\n            this.bindings[attr] = a;\n        } else {\n            var aname = b || attr;\n            this.bindings[attr] = function (v) {\n                data[aname] = v;\n                a.attr(data);\n            };\n        }\n        return this;\n    };\n    /*\\\n     * Set.attr\n     [ method ]\n     **\n     * Equivalent of @Element.attr.\n     = (object) Set object\n    \\*/\n    setproto.attr = function (value) {\n        var unbound = {};\n        for (var k in value) {\n            if (this.bindings[k]) {\n                this.bindings[k](value[k]);\n            } else {\n                unbound[k] = value[k];\n            }\n        }\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            this.items[i].attr(unbound);\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes range of elements from the set\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion… (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found and removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n        return false;\n    };\n    /*\\\n     * Set.insertAfter\n     [ method ]\n     **\n     * Inserts set elements after given element.\n     **\n     - element (object) set will be inserted after this element\n     = (object) Set object\n    \\*/\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    /*\\\n     * Set.getBBox\n     [ method ]\n     **\n     * Union of all bboxes of the set. See @Element.getBBox.\n     = (object) bounding box descriptor. See @Element.getBBox.\n    \\*/\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin.apply(0, x);\n        y = mmin.apply(0, y);\n        x2 = mmax.apply(0, x2);\n        y2 = mmax.apply(0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y,\n            cx: x + (x2 - x) / 2,\n            cy: y + (y2 - y) / 2\n        };\n    };\n    /*\\\n     * Set.insertAfter\n     [ method ]\n     **\n     * Creates a clone of the set.\n     **\n     = (object) New Set object\n    \\*/\n    setproto.clone = function (s) {\n        s = new Set;\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Snap\\u2018s set\";\n    };\n    setproto.type = \"set\";\n    // export\n    /*\\\n     * Snap.Set\n     [ property ]\n     **\n     * Set constructor.\n    \\*/\n    Snap.Set = Set;\n    /*\\\n     * Snap.set\n     [ method ]\n     **\n     * Creates a set and fills it with list of arguments.\n     **\n     = (object) New Set object\n     | var r = paper.rect(0, 0, 10, 10),\n     |     s1 = Snap.set(), // empty set\n     |     s2 = Snap.set(r, paper.circle(100, 100, 20)); // prefilled set\n    \\*/\n    Snap.set = function () {\n        var set = new Set;\n        if (arguments.length) {\n            set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n        }\n        return set;\n    };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var names = {},\n        reUnit = /[%a-z]+$/i,\n        Str = String;\n    names.stroke = names.fill = \"colour\";\n    function getEmpty(item) {\n        var l = item[0];\n        switch (l.toLowerCase()) {\n            case \"t\": return [l, 0, 0];\n            case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n            case \"r\": if (item.length == 4) {\n                return [l, 0, item[2], item[3]];\n            } else {\n                return [l, 0];\n            }\n            case \"s\": if (item.length == 5) {\n                return [l, 1, 1, item[3], item[4]];\n            } else if (item.length == 3) {\n                return [l, 1, 1];\n            } else {\n                return [l, 1];\n            }\n        }\n    }\n    function equaliseTransform(t1, t2, getBBox) {\n        t1 = t1 || new Snap.Matrix;\n        t2 = t2 || new Snap.Matrix;\n        t1 = Snap.parseTransformString(t1.toTransformString()) || [];\n        t2 = Snap.parseTransformString(t2.toTransformString()) || [];\n        var maxlength = Math.max(t1.length, t2.length),\n            from = [],\n            to = [],\n            i = 0, j, jj,\n            tt1, tt2;\n        for (; i < maxlength; i++) {\n            tt1 = t1[i] || getEmpty(t2[i]);\n            tt2 = t2[i] || getEmpty(tt1);\n            if (tt1[0] != tt2[0] ||\n                tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3]) ||\n                tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])\n                ) {\n                    t1 = Snap._.transform2matrix(t1, getBBox());\n                    t2 = Snap._.transform2matrix(t2, getBBox());\n                    from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n                    to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n                    break;\n            }\n            from[i] = [];\n            to[i] = [];\n            for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n                j in tt1 && (from[i][j] = tt1[j]);\n                j in tt2 && (to[i][j] = tt2[j]);\n            }\n        }\n        return {\n            from: path2array(from),\n            to: path2array(to),\n            f: getPath(from)\n        };\n    }\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    function getViewBox(val) {\n        return val.join(\" \");\n    }\n    function getColour(clr) {\n        return Snap.rgb(clr[0], clr[1], clr[2], clr[3]);\n    }\n    function getPath(path) {\n        var k = 0, i, ii, j, jj, out, a, b = [];\n        for (i = 0, ii = path.length; i < ii; i++) {\n            out = \"[\";\n            a = ['\"' + path[i][0] + '\"'];\n            for (j = 1, jj = path[i].length; j < jj; j++) {\n                a[j] = \"val[\" + k++ + \"]\";\n            }\n            out += a + \"]\";\n            b[i] = out;\n        }\n        return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n    }\n    function path2array(path) {\n        var out = [];\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            for (var j = 1, jj = path[i].length; j < jj; j++) {\n                out.push(path[i][j]);\n            }\n        }\n        return out;\n    }\n    function isNumeric(obj) {\n        return isFinite(obj);\n    }\n    function arrayEqual(arr1, arr2) {\n        if (!Snap.is(arr1, \"array\") || !Snap.is(arr2, \"array\")) {\n            return false;\n        }\n        return arr1.toString() == arr2.toString();\n    }\n    Element.prototype.equal = function (name, b) {\n        return eve(\"snap.util.equal\", this, name, b).firstDefined();\n    };\n    eve.on(\"snap.util.equal\", function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this;\n        if (names[name] == \"colour\") {\n            A = Snap.color(a);\n            B = Snap.color(b);\n            return {\n                from: [A.r, A.g, A.b, A.opacity],\n                to: [B.r, B.g, B.b, B.opacity],\n                f: getColour\n            };\n        }\n        if (name == \"viewBox\") {\n            A = this.attr(name).vb.split(\" \").map(Number);\n            B = b.split(\" \").map(Number);\n            return {\n                from: A,\n                to: B,\n                f: getViewBox\n            };\n        }\n        if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n            if (typeof b == \"string\") {\n                b = Str(b).replace(/\\.{3}|\\u2026/g, a);\n            }\n            a = this.matrix;\n            if (!Snap._.rgTransform.test(b)) {\n                b = Snap._.transform2matrix(Snap._.svgTransform2string(b), this.getBBox());\n            } else {\n                b = Snap._.transform2matrix(b, this.getBBox());\n            }\n            return equaliseTransform(a, b, function () {\n                return el.getBBox(1);\n            });\n        }\n        if (name == \"d\" || name == \"path\") {\n            A = Snap.path.toCubic(a, b);\n            return {\n                from: path2array(A[0]),\n                to: path2array(A[1]),\n                f: getPath(A[0])\n            };\n        }\n        if (name == \"points\") {\n            A = Str(a).split(Snap._.separator);\n            B = Str(b).split(Snap._.separator);\n            return {\n                from: A,\n                to: B,\n                f: function (val) { return val; }\n            };\n        }\n        if (isNumeric(a) && isNumeric(b)) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getNumber\n            };\n        }\n        var aUnit = a.match(reUnit),\n            bUnit = Str(b).match(reUnit);\n        if (aUnit && arrayEqual(aUnit, bUnit)) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getUnit(aUnit)\n            };\n        } else {\n            return {\n                from: this.asPX(name),\n                to: this.asPX(name, b),\n                f: getNumber\n            };\n        }\n    });\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n    has = \"hasOwnProperty\",\n    supportsTouch = \"createTouch\" in glob.doc,\n    events = [\n        \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n        \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n        \"touchcancel\"\n    ],\n    touchMap = {\n        mousedown: \"touchstart\",\n        mousemove: \"touchmove\",\n        mouseup: \"touchend\"\n    },\n    getScroll = function (xy, el) {\n        var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\",\n            doc = el && el.node ? el.node.ownerDocument : glob.doc;\n        return doc[name in doc.documentElement ? \"documentElement\" : \"body\"][name];\n    },\n    preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    addEvent = function (obj, type, fn, element) {\n        var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n            f = function (e) {\n                var scrollY = getScroll(\"y\", element),\n                    scrollX = getScroll(\"x\", element);\n                if (supportsTouch && touchMap[has](type)) {\n                    for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n                        if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\n                            var olde = e;\n                            e = e.targetTouches[i];\n                            e.originalEvent = olde;\n                            e.preventDefault = preventTouch;\n                            e.stopPropagation = stopTouch;\n                            break;\n                        }\n                    }\n                }\n                var x = e.clientX + scrollX,\n                    y = e.clientY + scrollY;\n                return fn.call(element, e, x, y);\n            };\n\n        if (type !== realName) {\n            obj.addEventListener(type, f, false);\n        }\n\n        obj.addEventListener(realName, f, false);\n\n        return function () {\n            if (type !== realName) {\n                obj.removeEventListener(type, f, false);\n            }\n\n            obj.removeEventListener(realName, f, false);\n            return true;\n        };\n    },\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = getScroll(\"y\"),\n            scrollX = getScroll(\"x\"),\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch) {\n                var i = e.touches && e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            // glob.win.opera && parent.removeChild(node);\n            // node.style.display = \"none\";\n            // o = dragi.el.paper.getElementByPoint(x, y);\n            // node.style.display = display;\n            // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        Snap.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n            eve.off(\"snap.drag.*.\" + dragi.el.id);\n        }\n        drag = [];\n    };\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds a click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes a click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds a double click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes a double click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds a mousedown event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes a mousedown event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds a mousemove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes a mousemove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds a mouseout event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes a mouseout event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds a mouseover event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes a mouseover event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds a mouseup event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes a mouseup event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds a touchstart event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes a touchstart event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds a touchmove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes a touchmove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds a touchend event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes a touchend event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds a touchcancel event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes a touchcancel event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            Snap[eventName] = elproto[eventName] = function (fn, scope) {\n                if (Snap.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({\n                        name: eventName,\n                        f: fn,\n                        unbind: addEvent(this.node || document, eventName, fn, scope || this)\n                    });\n                } else {\n                    for (var i = 0, ii = this.events.length; i < ii; i++) if (this.events[i].name == eventName) {\n                        try {\n                            this.events[i].f.call(this);\n                        } catch (e) {}\n                    }\n                }\n                return this;\n            };\n            Snap[\"un\" + eventName] =\n            elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--) if (events[l].name == eventName &&\n                               (events[l].f == fn || !fn)) {\n                    events[l].unbind();\n                    events.splice(l, 1);\n                    !events.length && delete this.events;\n                    return this;\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds hover event handlers to the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes hover event handlers from the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n    // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n    // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n    // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start.<id> on start, drag.end.<id> on end and drag.move.<id> on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for an element's drag gesture\n     **\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionaly following `drag` events are triggered: `drag.start.<id>` on start, \n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element is dragged over another element \n     * `drag.over.<id>` fires as well.\n     *\n     * Start event and start handler are called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler are called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler are called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        var el = this;\n        if (!arguments.length) {\n            var origTransform;\n            return el.drag(function (dx, dy) {\n                this.attr({\n                    transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n                });\n            }, function () {\n                origTransform = this.transform().local;\n            });\n        }\n        function start(e, x, y) {\n            (e.originalEvent || e).preventDefault();\n            el._drag.x = x;\n            el._drag.y = y;\n            el._drag.id = e.identifier;\n            !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: el, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"snap.drag.start.\" + el.id, onstart);\n            onmove && eve.on(\"snap.drag.move.\" + el.id, onmove);\n            onend && eve.on(\"snap.drag.end.\" + el.id, onend);\n            eve(\"snap.drag.start.\" + el.id, start_scope || move_scope || el, x, y, e);\n        }\n        function init(e, x, y) {\n            eve(\"snap.draginit.\" + el.id, el, e, x, y);\n        }\n        eve.on(\"snap.draginit.\" + el.id, start);\n        el._drag = {};\n        draggable.push({el: el, start: start, init: init});\n        el.mousedown(init);\n        return el;\n    };\n    /*\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut to assign event handler for `drag.over.<id>` event, where `id` is the element's `id` (see @Element.id)\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    // elproto.onDragOver = function (f) {\n    //     f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n    // };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from the given element\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].init);\n            draggable.splice(i, 1);\n            eve.unbind(\"snap.drag.*.\" + this.id);\n            eve.unbind(\"snap.draginit.\" + this.id);\n        }\n        !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n        return this;\n    };\n});\n\n// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        pproto = Paper.prototype,\n        rgurl = /^\\s*url\\((.+)\\)/,\n        Str = String,\n        $ = Snap._.$;\n    Snap.filter = {};\n    /*\\\n     * Paper.filter\n     [ method ]\n     **\n     * Creates a `<filter>` element\n     **\n     - filstr (string) SVG fragment of filter provided as a string\n     = (object) @Element\n     * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n     > Usage\n     | var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    pproto.filter = function (filstr) {\n        var paper = this;\n        if (paper.type != \"svg\") {\n            paper = paper.paper;\n        }\n        var f = Snap.parse(Str(filstr)),\n            id = Snap._.id(),\n            width = paper.node.offsetWidth,\n            height = paper.node.offsetHeight,\n            filter = $(\"filter\");\n        $(filter, {\n            id: id,\n            filterUnits: \"userSpaceOnUse\"\n        });\n        filter.appendChild(f.node);\n        paper.defs.appendChild(filter);\n        return new Element(filter);\n    };\n\n    eve.on(\"snap.util.getattr.filter\", function () {\n        eve.stop();\n        var p = $(this.node, \"filter\");\n        if (p) {\n            var match = Str(p).match(rgurl);\n            return match && Snap.select(match[1]);\n        }\n    });\n    eve.on(\"snap.util.attr.filter\", function (value) {\n        if (value instanceof Element && value.type == \"filter\") {\n            eve.stop();\n            var id = value.node.id;\n            if (!id) {\n                $(value.node, {id: value.id});\n                id = value.id;\n            }\n            $(this.node, {\n                filter: Snap.url(id)\n            });\n        }\n        if (!value || value == \"none\") {\n            eve.stop();\n            this.node.removeAttribute(\"filter\");\n        }\n    });\n    /*\\\n     * Snap.filter.blur\n     [ method ]\n     **\n     * Returns an SVG markup string for the blur filter\n     **\n     - x (number) amount of horizontal blur, in pixels\n     - y (number) #optional amount of vertical blur, in pixels\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.blur(5, 10)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.blur = function (x, y) {\n        if (x == null) {\n            x = 2;\n        }\n        var def = y == null ? x : [x, y];\n        return Snap.format('\\<feGaussianBlur stdDeviation=\"{def}\"/>', {\n            def: def\n        });\n    };\n    Snap.filter.blur.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.shadow\n     [ method ]\n     **\n     * Returns an SVG markup string for the shadow filter\n     **\n     - dx (number) #optional horizontal shift of the shadow, in pixels\n     - dy (number) #optional vertical shift of the shadow, in pixels\n     - blur (number) #optional amount of blur\n     - color (string) #optional color of the shadow\n     - opacity (number) #optional `0..1` opacity of the shadow\n     * or\n     - dx (number) #optional horizontal shift of the shadow, in pixels\n     - dy (number) #optional vertical shift of the shadow, in pixels\n     - color (string) #optional color of the shadow\n     - opacity (number) #optional `0..1` opacity of the shadow\n     * which makes blur default to `4`. Or\n     - dx (number) #optional horizontal shift of the shadow, in pixels\n     - dy (number) #optional vertical shift of the shadow, in pixels\n     - opacity (number) #optional `0..1` opacity of the shadow\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.shadow(0, 2, .3)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.shadow = function (dx, dy, blur, color, opacity) {\n        if (opacity == null) {\n            if (color == null) {\n                opacity = blur;\n                blur = 4;\n                color = \"#000\";\n            } else {\n                opacity = color;\n                color = blur;\n                blur = 4;\n            }\n        }\n        if (blur == null) {\n            blur = 4;\n        }\n        if (opacity == null) {\n            opacity = 1;\n        }\n        if (dx == null) {\n            dx = 0;\n            dy = 2;\n        }\n        if (dy == null) {\n            dy = dx;\n        }\n        color = Snap.color(color);\n        return Snap.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"{opacity}\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>', {\n            color: color,\n            dx: dx,\n            dy: dy,\n            blur: blur,\n            opacity: opacity\n        });\n    };\n    Snap.filter.shadow.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.grayscale\n     [ method ]\n     **\n     * Returns an SVG markup string for the grayscale filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.grayscale = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>', {\n            a: 0.2126 + 0.7874 * (1 - amount),\n            b: 0.7152 - 0.7152 * (1 - amount),\n            c: 0.0722 - 0.0722 * (1 - amount),\n            d: 0.2126 - 0.2126 * (1 - amount),\n            e: 0.7152 + 0.2848 * (1 - amount),\n            f: 0.0722 - 0.0722 * (1 - amount),\n            g: 0.2126 - 0.2126 * (1 - amount),\n            h: 0.0722 + 0.9278 * (1 - amount)\n        });\n    };\n    Snap.filter.grayscale.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.sepia\n     [ method ]\n     **\n     * Returns an SVG markup string for the sepia filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.sepia = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>', {\n            a: 0.393 + 0.607 * (1 - amount),\n            b: 0.769 - 0.769 * (1 - amount),\n            c: 0.189 - 0.189 * (1 - amount),\n            d: 0.349 - 0.349 * (1 - amount),\n            e: 0.686 + 0.314 * (1 - amount),\n            f: 0.168 - 0.168 * (1 - amount),\n            g: 0.272 - 0.272 * (1 - amount),\n            h: 0.534 - 0.534 * (1 - amount),\n            i: 0.131 + 0.869 * (1 - amount)\n        });\n    };\n    Snap.filter.sepia.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.saturate\n     [ method ]\n     **\n     * Returns an SVG markup string for the saturate filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.saturate = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>', {\n            amount: 1 - amount\n        });\n    };\n    Snap.filter.saturate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.hueRotate\n     [ method ]\n     **\n     * Returns an SVG markup string for the hue-rotate filter\n     **\n     - angle (number) angle of rotation\n     = (string) filter representation\n    \\*/\n    Snap.filter.hueRotate = function (angle) {\n        angle = angle || 0;\n        return Snap.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>', {\n            angle: angle\n        });\n    };\n    Snap.filter.hueRotate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.invert\n     [ method ]\n     **\n     * Returns an SVG markup string for the invert filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.invert = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n//        <feColorMatrix type=\"matrix\" values=\"-1 0 0 0 1  0 -1 0 0 1  0 0 -1 0 1  0 0 0 1 0\" color-interpolation-filters=\"sRGB\"/>\n        return Snap.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: 1 - amount\n        });\n    };\n    Snap.filter.invert.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.brightness\n     [ method ]\n     **\n     * Returns an SVG markup string for the brightness filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.brightness = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>', {\n            amount: amount\n        });\n    };\n    Snap.filter.brightness.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.contrast\n     [ method ]\n     **\n     * Returns an SVG markup string for the contrast filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.contrast = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: .5 - amount / 2\n        });\n    };\n    Snap.filter.contrast.toString = function () {\n        return this();\n    };\n});\n\n// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var box = Snap._.box,\n        is = Snap.is,\n        firstLetter = /^[^a-z]*([tbmlrc])/i,\n        toString = function () {\n            return \"T\" + this.dx + \",\" + this.dy;\n        };\n    /*\\\n     * Element.getAlign\n     [ method ]\n     **\n     * Returns shift needed to align the element relatively to given element.\n     * If no elements specified, parent `<svg>` container will be used.\n     - el (object) @optional alignment element\n     - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n     = (object|string) Object in format `{dx: , dy: }` also has a string representation as a transformation string\n     > Usage\n     | el.transform(el.getAlign(el2, \"top\"));\n     * or\n     | var dy = el.getAlign(el2, \"top\").dy;\n    \\*/\n    Element.prototype.getAlign = function (el, way) {\n        if (way == null && is(el, \"string\")) {\n            way = el;\n            el = null;\n        }\n        el = el || this.paper;\n        var bx = el.getBBox ? el.getBBox() : box(el),\n            bb = this.getBBox(),\n            out = {};\n        way = way && way.match(firstLetter);\n        way = way ? way[1].toLowerCase() : \"c\";\n        switch (way) {\n            case \"t\":\n                out.dx = 0;\n                out.dy = bx.y - bb.y;\n            break;\n            case \"b\":\n                out.dx = 0;\n                out.dy = bx.y2 - bb.y2;\n            break;\n            case \"m\":\n                out.dx = 0;\n                out.dy = bx.cy - bb.cy;\n            break;\n            case \"l\":\n                out.dx = bx.x - bb.x;\n                out.dy = 0;\n            break;\n            case \"r\":\n                out.dx = bx.x2 - bb.x2;\n                out.dy = 0;\n            break;\n            default:\n                out.dx = bx.cx - bb.cx;\n                out.dy = 0;\n            break;\n        }\n        out.toString = toString;\n        return out;\n    };\n    /*\\\n     * Element.align\n     [ method ]\n     **\n     * Aligns the element relatively to given one via transformation.\n     * If no elements specified, parent `<svg>` container will be used.\n     - el (object) @optional alignment element\n     - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n     = (object) this element\n     > Usage\n     | el.align(el2, \"top\");\n     * or\n     | el.align(\"middle\");\n    \\*/\n    Element.prototype.align = function (el, way) {\n        return this.transform(\"...\" + this.getAlign(el, way));\n    };\n});\n\n// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    // Colours are from https://www.materialui.co\n    var red         = \"#ffebee#ffcdd2#ef9a9a#e57373#ef5350#f44336#e53935#d32f2f#c62828#b71c1c#ff8a80#ff5252#ff1744#d50000\",\n        pink        = \"#FCE4EC#F8BBD0#F48FB1#F06292#EC407A#E91E63#D81B60#C2185B#AD1457#880E4F#FF80AB#FF4081#F50057#C51162\",\n        purple      = \"#F3E5F5#E1BEE7#CE93D8#BA68C8#AB47BC#9C27B0#8E24AA#7B1FA2#6A1B9A#4A148C#EA80FC#E040FB#D500F9#AA00FF\",\n        deeppurple  = \"#EDE7F6#D1C4E9#B39DDB#9575CD#7E57C2#673AB7#5E35B1#512DA8#4527A0#311B92#B388FF#7C4DFF#651FFF#6200EA\",\n        indigo      = \"#E8EAF6#C5CAE9#9FA8DA#7986CB#5C6BC0#3F51B5#3949AB#303F9F#283593#1A237E#8C9EFF#536DFE#3D5AFE#304FFE\",\n        blue        = \"#E3F2FD#BBDEFB#90CAF9#64B5F6#64B5F6#2196F3#1E88E5#1976D2#1565C0#0D47A1#82B1FF#448AFF#2979FF#2962FF\",\n        lightblue   = \"#E1F5FE#B3E5FC#81D4FA#4FC3F7#29B6F6#03A9F4#039BE5#0288D1#0277BD#01579B#80D8FF#40C4FF#00B0FF#0091EA\",\n        cyan        = \"#E0F7FA#B2EBF2#80DEEA#4DD0E1#26C6DA#00BCD4#00ACC1#0097A7#00838F#006064#84FFFF#18FFFF#00E5FF#00B8D4\",\n        teal        = \"#E0F2F1#B2DFDB#80CBC4#4DB6AC#26A69A#009688#00897B#00796B#00695C#004D40#A7FFEB#64FFDA#1DE9B6#00BFA5\",\n        green       = \"#E8F5E9#C8E6C9#A5D6A7#81C784#66BB6A#4CAF50#43A047#388E3C#2E7D32#1B5E20#B9F6CA#69F0AE#00E676#00C853\",\n        lightgreen  = \"#F1F8E9#DCEDC8#C5E1A5#AED581#9CCC65#8BC34A#7CB342#689F38#558B2F#33691E#CCFF90#B2FF59#76FF03#64DD17\",\n        lime        = \"#F9FBE7#F0F4C3#E6EE9C#DCE775#D4E157#CDDC39#C0CA33#AFB42B#9E9D24#827717#F4FF81#EEFF41#C6FF00#AEEA00\",\n        yellow      = \"#FFFDE7#FFF9C4#FFF59D#FFF176#FFEE58#FFEB3B#FDD835#FBC02D#F9A825#F57F17#FFFF8D#FFFF00#FFEA00#FFD600\",\n        amber       = \"#FFF8E1#FFECB3#FFE082#FFD54F#FFCA28#FFC107#FFB300#FFA000#FF8F00#FF6F00#FFE57F#FFD740#FFC400#FFAB00\",\n        orange      = \"#FFF3E0#FFE0B2#FFCC80#FFB74D#FFA726#FF9800#FB8C00#F57C00#EF6C00#E65100#FFD180#FFAB40#FF9100#FF6D00\",\n        deeporange  = \"#FBE9E7#FFCCBC#FFAB91#FF8A65#FF7043#FF5722#F4511E#E64A19#D84315#BF360C#FF9E80#FF6E40#FF3D00#DD2C00\",\n        brown       = \"#EFEBE9#D7CCC8#BCAAA4#A1887F#8D6E63#795548#6D4C41#5D4037#4E342E#3E2723\",\n        grey        = \"#FAFAFA#F5F5F5#EEEEEE#E0E0E0#BDBDBD#9E9E9E#757575#616161#424242#212121\",\n        bluegrey    = \"#ECEFF1#CFD8DC#B0BEC5#90A4AE#78909C#607D8B#546E7A#455A64#37474F#263238\";\n    /*\\\n     * Snap.mui\n     [ property ]\n     **\n     * Contain Material UI colours.\n     | Snap().rect(0, 0, 10, 10).attr({fill: Snap.mui.deeppurple, stroke: Snap.mui.amber[600]});\n     # For colour reference: <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n    \\*/\n    Snap.mui = {};\n    /*\\\n     * Snap.flat\n     [ property ]\n     **\n     * Contain Flat UI colours.\n     | Snap().rect(0, 0, 10, 10).attr({fill: Snap.flat.carrot, stroke: Snap.flat.wetasphalt});\n     # For colour reference: <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n    \\*/\n    Snap.flat = {};\n    function saveColor(colors) {\n        colors = colors.split(/(?=#)/);\n        var color = new String(colors[5]);\n        color[50] = colors[0];\n        color[100] = colors[1];\n        color[200] = colors[2];\n        color[300] = colors[3];\n        color[400] = colors[4];\n        color[500] = colors[5];\n        color[600] = colors[6];\n        color[700] = colors[7];\n        color[800] = colors[8];\n        color[900] = colors[9];\n        if (colors[10]) {\n            color.A100 = colors[10];\n            color.A200 = colors[11];\n            color.A400 = colors[12];\n            color.A700 = colors[13];\n        }\n        return color;\n    }\n    Snap.mui.red = saveColor(red);\n    Snap.mui.pink = saveColor(pink);\n    Snap.mui.purple = saveColor(purple);\n    Snap.mui.deeppurple = saveColor(deeppurple);\n    Snap.mui.indigo = saveColor(indigo);\n    Snap.mui.blue = saveColor(blue);\n    Snap.mui.lightblue = saveColor(lightblue);\n    Snap.mui.cyan = saveColor(cyan);\n    Snap.mui.teal = saveColor(teal);\n    Snap.mui.green = saveColor(green);\n    Snap.mui.lightgreen = saveColor(lightgreen);\n    Snap.mui.lime = saveColor(lime);\n    Snap.mui.yellow = saveColor(yellow);\n    Snap.mui.amber = saveColor(amber);\n    Snap.mui.orange = saveColor(orange);\n    Snap.mui.deeporange = saveColor(deeporange);\n    Snap.mui.brown = saveColor(brown);\n    Snap.mui.grey = saveColor(grey);\n    Snap.mui.bluegrey = saveColor(bluegrey);\n    Snap.flat.turquoise = \"#1abc9c\";\n    Snap.flat.greensea = \"#16a085\";\n    Snap.flat.sunflower = \"#f1c40f\";\n    Snap.flat.orange = \"#f39c12\";\n    Snap.flat.emerland = \"#2ecc71\";\n    Snap.flat.nephritis = \"#27ae60\";\n    Snap.flat.carrot = \"#e67e22\";\n    Snap.flat.pumpkin = \"#d35400\";\n    Snap.flat.peterriver = \"#3498db\";\n    Snap.flat.belizehole = \"#2980b9\";\n    Snap.flat.alizarin = \"#e74c3c\";\n    Snap.flat.pomegranate = \"#c0392b\";\n    Snap.flat.amethyst = \"#9b59b6\";\n    Snap.flat.wisteria = \"#8e44ad\";\n    Snap.flat.clouds = \"#ecf0f1\";\n    Snap.flat.silver = \"#bdc3c7\";\n    Snap.flat.wetasphalt = \"#34495e\";\n    Snap.flat.midnightblue = \"#2c3e50\";\n    Snap.flat.concrete = \"#95a5a6\";\n    Snap.flat.asbestos = \"#7f8c8d\";\n    /*\\\n     * Snap.importMUIColors\n     [ method ]\n     **\n     * Imports Material UI colours into global object.\n     | Snap.importMUIColors();\n     | Snap().rect(0, 0, 10, 10).attr({fill: deeppurple, stroke: amber[600]});\n     # For colour reference: <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n    \\*/\n    Snap.importMUIColors = function () {\n        for (var color in Snap.mui) {\n            if (Snap.mui.hasOwnProperty(color)) {\n                window[color] = Snap.mui[color];\n            }\n        }\n    };\n});\n\nreturn Snap;\n}));"
  },
  {
    "path": "doc/css/dr.css",
    "content": "#content section.code {\n    display: block;\n    font-weight: 400;\n    background: #181818;\n    -moz-border-radius: 10px;\n    -webkit-border-radius: 10px;\n    border-radius: 10px;\n}\n#content section.code pre code {\n    font-size: 14px;\n}\ncode {\n    font-family: source-code-pro, Menlo, \"Arial Unicode MS\", sans-serif;\n}\na.dr-hash,\na.dr-sourceline {\n    -webkit-transition: opacity 0.2s linear;\n    color: #333;\n    font-family: Menlo, \"Arial Unicode MS\", sans-serif;\n    margin: 0 0 0 .3em;\n    opacity: 0;\n    text-decoration: none;\n}\nh2:hover a.dr-hash,\nh3:hover a.dr-hash,\nh4:hover a.dr-hash,\nh5:hover a.dr-hash,\nh2:hover a.dr-sourceline,\nh3:hover a.dr-sourceline,\nh4:hover a.dr-sourceline,\nh5:hover a.dr-sourceline {\n    opacity: 1;\n}\n.dr-param {\n    float: left;\n    min-width: 8em;\n}\n.dr-type {\n    float: left;\n}\n.dr-title {\n    float: left;\n    margin: 0 8px 0 0;\n}\n.dr-type em,\n.dr-returns em,\n.dr-property em {\n    -moz-border-radius: 5px;\n    -webkit-border-radius: 5px;\n    background: #ccc;\n    border-radius: 5px;\n    float: left;\n    font-size: .75em;\n    font-style: normal;\n    font-weight: 700;\n    margin: 0 8px 0 0;\n    min-width: 80px;\n    padding: 2px 5px;\n    text-align: center;\n}\n.dr-type em.amp,\n.dr-returns em.amp,\n.dr-property em.amp {\n    float: none;\n    background: none;\n    font-size: 1em;\n    font-weight: 400;\n    font-style: italic;\n    margin: 0;\n    padding: 0;\n    min-width: 0;\n}\n.dr-property em.dr-type {\n    margin: 4px 16px 0 0;\n}\nem.dr-type-string {\n    background: #e1edb1;\n    color: #3d4c00;\n}\nem.dr-type-object {\n    background: #edb1b1;\n    color: #4c0000;\n}\nem.dr-type-function {\n    background: #cfb1ed;\n    color: #26004c;\n}\nem.dr-type-number {\n    background: #b1c9ed;\n    color: #001e4c;\n}\nem.dr-type-boolean {\n    background: #b1edc9;\n    color: #004c1e;\n}\nem.dr-type-array {\n    background: #edd5b1;\n    color: #4c2d00;\n}\n.dr-optional {\n    display: none;\n}\nol.dr-json {\n    background: #ddd;\n    list-style: none;\n    margin: 0 -30px;\n    padding: 16px 30px;\n    line-height: 1.5;\n}\nol.dr-json .dr-json-key {\n    float: left;\n    min-width: 50px;\n    margin-right: 16px;\n}\nol.dr-json .dr-json-description {\n    display: table;\n}\nol.dr-json ol.dr-json  {\n    margin: 0;\n    padding: 0 0 0 50px;\n}\n#pageNav li.dr-lvl1 a {\n    padding-left: 1em;\n}\n#pageNav li.dr-lvl2 a {\n    padding-left: 2em;\n}\n#pageNav li.dr-lvl3 a {\n    padding-left: 3em;\n}\n#pageNav li.dr-lvl4 a {\n    padding-left: 4em;\n}\n#pageNav li.dr-lvl5 a {\n    padding-left: 5em;\n}\n#pageNav li.dr-lvl6 a {\n    padding-left: 6em;\n}\n#pageNav ol {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n}\n"
  },
  {
    "path": "doc/css/main.css",
    "content": "html,body{\n  margin:0;\n  padding:0;\n  height: 100%;\n}\nbody {\n  font-family: source-sans-pro, sans-serif;\n  position: relative;\n  -webkit-font-smoothing: antialiased;\n}\nbody.light {\n  background: #F4F4F4;\n}\nbody.dark {\n  color: #F0F1F1;\n  background: #4A4D4E;\n}\nbody.light {\n  color: #181919;\n}\n\nh1 {\n  font-weight: 600;\n}\n#wrapper {\n  width: 100%;\n  overflow-x: hidden;\n  background: inherit;\n  position: relative;\n}\n#site {\n  width: 100%;\n  position: relative;\n  z-index: 10;\n  background: inherit;\n  left: 0;\n  transition: all 0.2s ease-out;\n  -webkit-transition: all 0.2s ease-out;\n  transform: translate3d(0, 0, 0);\n  -webkit-transform: translate3d(0, 0, 0);\n}\n#site:before{\n  position: absolute;\n  content: '';\n  left: -4px;\n  height: 100%;\n  width: 4px;\n  background: #3B3E3E;\n}\n#site.open {\n  transform: translate3d(250px, 0, 0);\n  -webkit-transform: translate3d(250px, 0, 0);\n}\npre {\n  font-family: source-code-pro, sans-serif;\n  font-size: 12px;\n}\n/* Main Header */\n#main-header {\n  color: #373435;\n  background: #fff;\n  height: 98px;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 10px 20px;\n  position: relative;\n}\n#main-header hgroup {\n  text-align: center;\n}\n#main-header hgroup h1 {\n  font-size: 40px;\n  margin: 5px 0 0;\n  letter-spacing: -.065em;\n  line-height: 1.1em;\n}\n#main-header hgroup a {\n  color: #464646;\n  text-decoration: none;\n}\n#main-header hgroup a:hover {\n  color: #000;\n}\n#main-header hgroup p {\n  font-size: 13px;\n  color: #999;\n  margin: 0;\n}\n#main-header nav {\n  display: none;\n}\n#slide-menu-button {\n  position: absolute;\n  top: 20px;\n  left: 20px;\n  display: inline-block;\n  vertical-align: top;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-background-clip: padding;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  -o-text-overflow: ellipsis;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  padding: 0 0.5rem;\n  line-height: 2rem;\n  letter-spacing: 1px;\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  vertical-align: baseline;\n  -webkit-box-shadow: inset 0 1px #fff;\n  box-shadow: inset 0 1px #fff;\n  -webkit-border-radius: 3px;\n  border-radius: 3px;\n  width: 2.6rem;\n  height: 2.6rem;\n  line-height: 2.6rem;\n  border: 1px solid transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n#slide-menu:disabled,\n#slide-menu.is-disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n#slide-menu-button:active,\n#slide-menu-button.is-active {\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  background-color: #d3d7d7;\n  border: 1px solid #a5a8a8;\n  -webkit-box-shadow: inset 0 1px rgba(0,0,0,0.12);\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n#slide-menu-button span {\n  background-repeat: no-repeat;\n  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCIgWw0KCTwhRU5USVRZIG5zX2V4dGVuZCAiaHR0cDovL25zLmFkb2JlLmNvbS9FeHRlbnNpYmlsaXR5LzEuMC8iPg0KCTwhRU5USVRZIG5zX2FpICJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlSWxsdXN0cmF0b3IvMTAuMC8iPg0KCTwhRU5USVRZIG5zX2dyYXBocyAiaHR0cDovL25zLmFkb2JlLmNvbS9HcmFwaHMvMS4wLyI+DQoJPCFFTlRJVFkgbnNfdmFycyAiaHR0cDovL25zLmFkb2JlLmNvbS9WYXJpYWJsZXMvMS4wLyI+DQoJPCFFTlRJVFkgbnNfaW1yZXAgImh0dHA6Ly9ucy5hZG9iZS5jb20vSW1hZ2VSZXBsYWNlbWVudC8xLjAvIj4NCgk8IUVOVElUWSBuc19zZncgImh0dHA6Ly9ucy5hZG9iZS5jb20vU2F2ZUZvcldlYi8xLjAvIj4NCgk8IUVOVElUWSBuc19jdXN0b20gImh0dHA6Ly9ucy5hZG9iZS5jb20vR2VuZXJpY0N1c3RvbU5hbWVzcGFjZS8xLjAvIj4NCgk8IUVOVElUWSBuc19hZG9iZV94cGF0aCAiaHR0cDovL25zLmFkb2JlLmNvbS9YUGF0aC8xLjAvIj4NCl0+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zOng9IiZuc19leHRlbmQ7IiB4bWxuczppPSImbnNfYWk7IiB4bWxuczpncmFwaD0iJm5zX2dyYXBoczsiDQoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4Ig0KCSB2aWV3Qm94PSIwIDAgNDAgNDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDQwIDQwIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzd2l0Y2g+DQoJPGZvcmVpZ25PYmplY3QgcmVxdWlyZWRFeHRlbnNpb25zPSImbnNfYWk7IiB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4NCgkJPGk6cGdmUmVmICB4bGluazpocmVmPSIjYWRvYmVfaWxsdXN0cmF0b3JfcGdmIj4NCgkJPC9pOnBnZlJlZj4NCgk8L2ZvcmVpZ25PYmplY3Q+DQoJPGcgaTpleHRyYW5lb3VzPSJzZWxmIj4NCgkJPGcgb3BhY2l0eT0iMC43Ij4NCgkJCTxnIG9wYWNpdHk9IjAuNzUiPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzksMTF2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwxMywzOSwxMi41MiwzOSwxMXoiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMTBWOWMwLTEuNDctMC40OC0yLTItMkgzQzEuNDcsNywxLDcuNTIsMSw5djFjMCwxLjU1LDAuNTIsMiwyLDJoMzQNCgkJCQkJQzM4LjUsMTIsMzksMTEuNTIsMzksMTB6Ii8+DQoJCQk8L2c+DQoJCTwvZz4NCgkJPGcgb3BhY2l0eT0iMC43Ij4NCgkJCTxnIG9wYWNpdHk9IjAuNzUiPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjRkZGRkZGIiBkPSJNMzksMjJ2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwyNCwzOSwyMy41MiwzOSwyMnoiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMjF2LTFjMC0xLjQ3LTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MWMwLDEuNTUsMC41MiwyLDIsMmgzNA0KCQkJCQlDMzguNSwyMywzOSwyMi41MiwzOSwyMXoiLz4NCgkJCTwvZz4NCgkJPC9nPg0KCQk8ZyBvcGFjaXR5PSIwLjciPg0KCQkJPGcgb3BhY2l0eT0iMC43NSI+DQoJCQkJPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGw9IiNGRkZGRkYiIGQ9Ik0zOSwzM3YtMWMwLTEuNDcxLTAuNDgtMi0yLTJIM2MtMS41MywwLTIsMC41Mi0yLDJ2MQ0KCQkJCQljMCwxLjU1LDAuNTIsMiwyLDJoMzRDMzguNSwzNSwzOSwzNC41MiwzOSwzM3oiLz4NCgkJCTwvZz4NCgkJCTxnPg0KCQkJCTxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMzksMzJ2LTFjMC0xLjQ3MS0wLjQ4LTItMi0ySDNjLTEuNTMsMC0yLDAuNTItMiwydjFjMCwxLjU1LDAuNTIsMiwyLDJoMzQNCgkJCQkJQzM4LjUsMzQsMzksMzMuNTIsMzksMzJ6Ii8+DQoJCQk8L2c+DQoJCTwvZz4NCgk8L2c+DQo8L3N3aXRjaD4NCjxpOnBnZiAgaWQ9ImFkb2JlX2lsbHVzdHJhdG9yX3BnZiI+DQoJPCFbQ0RBVEFbDQoJZUp6c3ZlbVNKTG1SSnZnRTlnNitQMXFFSEprS0dnQ0RBY1lkV1pId09IbzRRM2FYa094anBXV2tKSmtWVGVaMEhpVlpXZVJ5bjM3MQorMVFWZ0xsN1pFVWVSVksySzFDVkVhNE9nNW5oVU9qeHFlTHYvbzh2Zi9QRjlkZHZmdmZ3UmJxYUQ5UGYvZDNOMjRkbjc5NjgvZm1CCjFNTXZYcjc4N3R0M2IwSDZ5YTkvZWdqcjFTeVZybjlSdjdLSy8venc5dHNYYjE3L25GOWRKZm55SGxmLzVCZmZQdnZkdzh1WEQ0ZGYKUG52OTlicy9QSHY1OFBhbmg1LzhWTDcvN1l0M0x4K2t4aCtldmZyZGQyOS8vL0QyNnRzLy92Nm5mbXRwNi9iWk8vbCsrVm44V1VpSAorUE01SHI3OEZiNSs5dnFQejc3OTlzWC8rNENicFlwN0hkOTg5L3JyRjY5L2Yzenovd2p4OEVYS2g3UWR2aWp5MVg5LzhldUhiOS96Ci9lMmI1OSs5ZW5qOTdzdTNiNTQvZlB2dHpadVhiOTUrKy9QRHpaK2Z2VDc4NnRudjVadG5oLzliM3VETm53N0hsOCtlLzhja2I1Mi8KdW4veDhrRmU4Tld6ZDRjUTBSZlh2d2p4cStOM0wxNSsvUS9mdmZyZGc3ejZ1cEdjdm1LVC8vU3R0Q1hONG0rUXkxZS9lQ1dVM3p5OApleWZQSlRkRWYvNzY3NC9qWXdpUjVTZi85dXVIMzc5ZzkwdTMvSytmV3JOdjMzeno2dG5iLzhDMWh5K1crU0QvMlIxLysvRHFtNWZTCmUzemRPRi9sd3hmOHQvOXA5ZVF0V09lTHVGYnBsYkllMGx3UEtWZjl2dmZOd3g5ZlBQenA1NGQvZVBQNlFUdmcrdTI3MytnUUxNczgKNjcvNnphKy9rekgrcDljdjNzbURyU0J0MmdPL2V2UDF3MHVwMzY2L2YvbU1MODRTK3I5YTRiZlBaRTY4azdGNzgvSzdkNXhaMWU4ZwpQZnpMWjM5K3dEQUZ2Y0UvZnZQdytyZHYvcG5QK0VVTTBrN2NyclpEWE9TTlF0eVdRNmhzUCtKUnQ3bmRNL1IvdFdrMGhHYThmY3lRCkwyV2Mvdkh0aTkrL2VQM3pMMUtWdms1eDFpSDgrN2N2dnU0akdBN1YvcGZHcitydy8rYi82OVBLaTc5NzkvRGFubDdtemMydmhua3cKWC8zcU4zTFh1OWRmMzd4NWhkNy9GaE5jSnNCcm1Sc3YzL3hldjJ0Lzh4dTUvTHR2OUEzNCtTc1pxQy9mdm5pTk5xZC80RGYxcXk5ZgpmaWRmL2YzYk45OTk4NHZYLy81bStva3U3WDkrZUM3clY4Ynk2OE0vL3U1L3l3ZFpuNXliaDkrK2ZmWmNHcERQcmM3VnN4ZmYvUFM5Cnpjbkx2WDA0NkpkeUpULzY3KysvK3ZiaDMyVlY5Y3VWZXZmNmp3OHYzM3d6Tk5zb3dsVU8vL0xzN1RmZjMvU1hMNSs5ZnZiMlFIcHIKK1pjdi9pamZQSk9lNm0xMzJoTWFsVm55alhRT0wyR1ZreHU4cDhMdzFSTnU5T3pkSDRRQlBieisrdHZXdG43Y1A3alN2cis5M3p6SApISHg3T0w3OTd0cy9ISDc3NXMzTDF1eitxOWE2a1VsRi9iK05lM3pKQzE3LzQydnRvUE03V1lYVE93bi8rWnU3aTlSKy9BN3k1ZDl5CjZ6ZlBYcjU4OGZ1M3o3NzV3NHZubDI1dzRmdDJKLzN1UXliV24xLzk3czNMRjkrKzZ2TnBvSHo1N08yN0Y4OWZQdnptejkrK2UzajEKNU1FOTNIMzlRcGpjSTh2NHZYVis4NmRuNzU3LzRaY3ZmdmYyMmRzWEQrOWRmUmlBZjMveCttdVorNy81N3NXN2g5NUJiMTU5QXlubAo4SnMvUFB2bWdhL3g3Zy8zclBtYjFtRCtTbGoveU55LytPSTlYRCtzaCtQcjRmdS9mL3ZzNnhleW9ZalE5ZmR2WG43OThQcndhN0QzCmFmZEp0cTl5T0g0OS9kczBXd2tzeStIdnZqcStuZjdiTkovK2hKTVNoNUtzTEZZeS8vZXk0djlKZm8ybHRGTG5iVmV1aDNLVWNtUGwKZGloMzgvMDAzM3ZaUGRqNEU0ZVNockxzU3RZeThWY0pxNVRDMzNVbzI2NWNoMk1yTjYwY3c2MFUvM1E3eVljN2ttN0QvVmpHcnVQRAorVThheWpLVUhGZVVTWC9GTXBRYU55bjY3L1ZRamxxbS8rdlNXRDQybW1rM25zc3dxbjFzcFV4dGVKZGhrSFZVeDlHdFV2QWJvMXAzCjQ3c05JeXovVGpiVVB0akhOc3o2RzZOOE40NjIvS3MvODhXeGp0TnVvSk9NSzM1alpESEdLMHZsS0plVEViNjJzaDliR1V2OHVtTzUKUFJsRnYybmlHUFl4UTlGQjhpSGJiTEJrZ0NZYkk0elZqWlZibGpzcjl5aStzdkF5NDFnR2p0SmlIVi9ab1VjdWtudjJUZVRMcjN5OQpqYTl5eXljTzlvUXJwNHc4d3NUNzRqNHhwYlNrTlJWUnRyWjBsSEtiN21XMHc1S1daY2xMV2VxeUxkZkxjYmxkN3BaNzZjaVlVMTd5Cm1rdmU4blUrNXB0OGwrOG5lYUFnczNSWjg3cXVkZDNXNi9XNDNxeTM2NzNNaFNEZHNKUmMxbExMVm83bHB0eVdlNWtub2NhNjFGelgKV3VwV3IrdXgzdGE3ZWkvekpVNWIycFpOMnRucXRtM0g3V2E3Mis1bDBvVHJkTDFjNSt2MXVsNXYxOWZYUnlrMzE3ZlhkNXhKVVY1ZwpPZVpqT2RiakpsOGRqemZIdStPOXpLNHdzYmZUelhLVGIrUUJicmFiNjV2anpjM043YzI5VExiQVVWaHU4KzE2S3c5M1cyKzMyK1B0CnplM2Q3ZjNkTE9PUzdwYTc5YTdjMWJ2dFR1NTFkM04zTzkzZDNkMWpSdHhMaDkzbmUzblRlM24yKzJzcGNzdDd1ZkwrNUVmR2NwYlIKYkovdmhuSTdsSnVoSEhmbGVpaWJsMG4rcVVNcFExbDNKUTlsR1VvYWlrekE2VDYyTXJLd3puem44ZEh2eHAvYlhiblJNdkhYY1NqWApROWwycFE2bERHVWRTcDd1Y2l2THJxU2h4S0dFb2N4ajBTNmZyTy9IcHg5L2JvWnkxTUtWdVJ2SC9lanR4OHhIYXo5RSsyR1JvWmlHCjBkZ1B3YjdqOTkxdDNYelN0K3pQcVhYcHZpUDN2YmZ2c1pOKzJuZk5kTklqMmh2WFZqYVdhcVZZV1ZteWxZVWxXWWtUMTU1dG1jcjYKMi9UM045TjcrYytSNWRyS3hsS3R5TnFlNUovVlNyYXlzQ1FyeW5xZDBRc0g5Ykc4NC9nZE9WNlY0NU01SUJpRW1kMSt5MjYrWnE4Vwo5dVBDZmd2c3B6dDJ6SkVkVVNlK2VlYTc0Z1ZudnRBdFgrQ2FqMXo0aEF1ZlNKNURac3VkZE9hTjhLMXI0VjlWK05ncTNHd1JyaGFGCm04K1RUS1E3NmVVYllYclh3djdxZFJGR21JVWhKdGxSZ3V5dzl6TGl0OUlkeCsxYTJHYmRpakRRTEl3MHlSWVVaRCsrbDRsd0s5MTAKRkc2NzFUb0o0MTJGQVM4MUNTc09zbkhmeXd5NWxUNDhsbXRoMWJVVVlkcFptSGNTRmg1a283K1h1WE1ySFhzVUJyOEpveS9DN3JPdwovU1RNUDZ6ekpOUDRUc2I0UmphR2E5a2dxbXdUYTg2eVlTVFpPSUxJRHZjeTNXNWxMSTZ5cVd5eXVaUmxsVzFta2UwbXlxWXp5N3kvCmsxbHhJeHZSdFd4SWRaS2RhVTFaOXFna2UxVVFXZVZlWnVpdERCOTJVV3lyMkdpemJHN1lpRU9jQTdoc0UyaXRGdXA1TGRhVEJhV2IKT3VRMzdQd2JKUU9WRkVSMjRIeDQ1SFpzaGczNDVmMWlpQjJ4TTRiN2dkVXJTOWhrVW1XWlVFRW0wNldwRkcyUDRPNkRIOTJCQXRjbApkcUhNMWVzN2tlMUYySXBrdHhFaGdQZkdmdGMydTFWbVdiMnczYVcyM1dHenU4WU5lWEdUR0pMSm9NV2xCZ29OZHhRYmdna091WWtPCjEyTzNveGNncDgzMzJxUjhvREIzeTQ5WUxicFdmRU5zdXlpLzU1dnpyWFVZcmltVjNLWGR5RklrREUzb1VRbFBCUitWNUc0b2lOOUoKMDhHRWJIMGRsNXBOU3FaYXdhYThvZDRNRzJGdjZNVVhlMElmZVJ3b0hhU2RzRUJKSWNuSUY1a0JSODZGRStuQXV5TGJCdUFjWitRNQpmYXAwdmpOeUh2SWU3ZUlMN0dqUGpiNlBGMm5YbjZ6R1QxNk14eWIrZXVtS1ROMnBPTVhVSGkxNXB4bVp0alRaSC82akF2bE9SOTJyCllMN0hOQVd0U2Zvc3gybW4yTjFRZ25hbEFMKzNrMUpQU2xjaTlhOTFjald6bGVXc3BMTVNMeFQ3bVhhYTdwbENoeFUzQ21udDkrM0YKSW54aWFwcjJqU2xqUjlYT0xwYnQwVkpkNzVzR0pWL0wrc1RTVmNvOGxtbi9zUmtiK3QvbkpUMVNPQ21tT1Q2eFhPcmdDMlY2WXNVbgovMXpTM1QvcDU3TTE2UHRpYUQycU1xcUwyYmRXVk1KeW80UWJLYXJwd203RXNKVSttZHJzeTl2TkluMzZuNjVtbDFCOTlZNEw5cWpyCjJGWDY4OVZhbWdsZ3RaS2JnYURiaHRLNFFLZnZYNW55VnpOTGRQUFV5WEwwQlhrN0RVYXQwY2gxdkxnY2p6dlQyUG1DTkdQSzZmcXMKT3l0YnQ4NjRoZWJTRW0yZnA3T1ZlYm9JenhmbGU4dDBaakM4dEZMZnQzNVBsdWMwMkNBL2VRMi9ieDMvOVpmZFoyL3drb2c2YWovbgorby9LSStmNmowc2hNM1RvTzBvYm0ybCtxOGtic1drLzk0UEVVWFlTUnh3MG9CdlJnYWdCVGFJQ1FRbFNGUWhLMEV3TlNIV2dHeHAvClZBK3FUUTlLcGdkQkU3b1JMZWhJUGFqU2xMUk1WSVVDRjhjOXRlSmIzRUd1cjZJSnFTNEViU2lxTmtSOTZOYjBvU1Axb1VwOUNCb1IKT0ZlWVRDbTZwNFlMdFVnVkk2aEdsYW9SbEtPRnlsSGdVcnFuaG5SRERRazZFclNrSW5kRlZWR0VKbEdVRXRsaG9Hbm1qdXJTcmFoTApVSmlnTWtGcGd0cFVsa3pGQ2FwVElxZWFxVDdkbTJKOTFES0ozQWJKRGJKYm9meTJvbjdDVDZEODFMazRaRm9kaXk2bHFXUldxVUNoCkxGUGoxR2RTMXlCanVTVlZmNDhNZUJTUktBOU5neEMwWTZwbmpITW51ZXg0NUk0alRqdVpCT1dFdDExa2ErK1JJTTRsaHFleGlVZloKeCtkY3g2WXRhaG5OVk9QUDNpdzNtQnIzdGpEZlZ5ZjdJKzVLMnBXOTJTMmZsSFZYeXJRejVaV2RrYTlTVWRxWDY1TnlQQzFUczNsNQp1VDByNXovMzU4WG4yRFR1MVBmaFFva1hTN3BZekpKM1h2SWpaWDIwTkZ2dXREUHNGcHFiMzFlMjd5blgwODZjZkxrY24xakkzS2VkCjVmcDk1ZlpwWmJwQXZEU0lUeTdUbzE5OTVNLzVKdnF4RFpuaFptN3FaelNQaFpiRmlwb3ozYnhackxqMWM3Tml0dEhKVEtYKzQ3eWgKTHhzZkQrZXNyaUs3Sk85V1dyWFpMaE9OUmxyV1Z0ek1XMXZackZ5M2NyekFvK1JuT21OUWwxaFROOTFmNWtZREg1b2VZVUtQY1ovSAp1TTdBYVk2MDRUek9hOTdEWTNaTXhSakw5RjZlY29HVGZCOExtZDdQTjU3QU1rNVl3elJ5aVk5bURjTjZmNHd4UEpFTm5LLzh4OWZ4Cis4dGZhQjEva0ExMVowVVZrZTFHaloxMHdrTE9Tc3N5aWFTM0RyN1lvM0FDOWNmTzVwR0ZUemJUSzF0Rm9IVFA3QzE4czdLNXFITTIKVVJTRmc3Wk1sRS9kU3dzLzdSMDl0ZXFyVFpBdTZhL0ZEM3kyMXhTQTRiZkZBbExmTGJ5M0VDenB3WjNveEsyUXRPbklQUW8zdW0zdQozRm5FUDBpUzhPa3U4bmlRa0F2RjhrMUU5R3Y2ZDIrRVg5eVpsM2UrRHBQSThaSHlQTnk5Y1BpdTE0V1Mvalk0ZnVuNmxZTHBDRUV3CjBNQ1k2QWFHSXhnQ2VhRTd1RTdIalQ1aDlRcmZrQmRoYWQvVFB6dzNsdXZNMXRtc3M5Zk9WbzJqVG8yVmRoYnFyTE16emM0ck80L3MKdkhIa2lMZFQ0NE1qLyt0OGI4L3JSaFkzc3JXQm1VMERIOXV6cmhObWRVSHlPZWRIZzB4eldXNTVqTXVjaUIxam1kN0hOYjZYVFR4eApnLy9ZZFd5RzYzK2JSbEJ4T0VUNWF6M1UrV3FSNVhJbzZVb1dTRVRWMzB4Lzk5VlRxaDYvUFcveEtrdkZQQjlxdUJJOWNIMjB1ZE42CmFPc3FyR1ZiZ253Wm9OMUdSeW5uV3VNaWY1UWM3ZXNZOHJvZFVFRWJpVmRwemt1NzJTYzN4S2VaUlRQTnE5U2FaWkd2dUU2VWExRysKMmRhMjVIa2pkbHFZNHBMbGo0amZZV2dyWGMzQ1Z2cERmYWIyOU5uV1dSZ3Eyc3Boem9YWFZXSEUycGFvaUZYYmo4SlIwWmFNVzk1MgpiZVY1M29abit6enRmZndveG5KVlU5clFVczFsKzhTaFBHM3R3a3kxSjkrMksrSG5qMDNUZlNWcDVYamJJSTZPVkx3TVh2ekh0OC8vCjhPTHJuMDcrQjREOURiSjR0YTVCOWttTVk0cWxyQVF3eXVKaTkrSnJqUHh1MmRvVkI3OUM0eERzaW9OZFljdFVIbGlVOWVHVlB1SmkKN2JDblhvaHVXdGFybERDOVArTEcrK3MvcEp0Lzh4OS9sajdHdjNMaG9oMzgzM3ovdWJkZEo5cCtrODJmV1d4M3ViWU41WFowUE50bQpzUmdXU25ZRFNrS3lGd1REZVMwVUVZRDBPbEkwdUtkVlNFV0NsY0xBTmNXQU8rNFNBSHBoMzljOS81cld2dHRUWUtPQ0dOMGpwUFp0Ck5aTmpMNTROQUtvdVhVZHcwaXZjUUhINU1hemtwWi9IMGJDajhUcWJVWVpXUWtWT0VEdlIwQk9uaHNKaUtBckZVUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJR0pLQ3BzSTdBMVBjWkhYcnZoOGVNcUJEbm9RTkdYMnpUUkFLQmgwWXdRTWRQbkNqMHM0QUlWaWFkTE01ak9CV3h3bGlyQ0VKSWIxVwpSeEZTWmxVTVlhV2NDdmtVMG1tV2ZvQkllaU9UYmFZWW1nMHdlRnZVUDQ1dU5keEZSMTdzZ0J0bU81eWIxL09HMWtFMUJ4WXoreTNtCk1RaG1DSDh5WU9aSmFCa0ZCSFR6dHpyY28yS2JETk4wMjNCTTE0WmVjbk40TnBpU3dwTm1Da1YzT3kvNkFCUnRVRkUxbjZvL1BEV3QKSWxPeldLbGRGR29ZbGRiZ2Erb1pSeG9XYmllS2xmZFVPTHJLb2VoUGpKdnFIYXA1ZE4yRDJvZmhRUlVSQ3YwREdzZzZVUW1wVkVKYwpEYm5kcVNJbnlvanBJaGg2UjQxU0gzR05aRHBSU1RBbk5nT1MzbENxdm10dzBraUZ4RUdsbzBaeVE0M2tEZ0xwWkFwSkdoU1NZc3JJCmtjcklMWlVSQlp4MlBXUVo5QkRvSUUwTG1Xamo2R3JJdVNLU1RSR2hLdEwwa0NOMUVXb2l5b2NNY0dmNDV3R2tTRS9oK2Q5MzdlODkKMWF6bWs4R281WVA1SXUrNlY5TC9Hbjgza1BVSXFsZUR2RUdzUTdQUXA0YXc3Ny9UN3ZkaTdOZmgyTG5oN3RYNEwxeHgyaUh2SFg5Zgo3Ri8xR3VpLzZzenQvMTd2ZkF5M0J0VTIvRDJCUDNBVUQxanRqdFJPNXNKWURhdTltaTlhUFIwZFZFOC95RFRncy91UzYwc3RFUkJ6CnVzdzRZd2lja2RYLy9qMW05QkdjK2dzZTh5Nll0M0owTVlUbWxoZ2RGT2NPMFhPZjZ1SmVqbE5IN1BtbjhmZnAzeU10ZThSQUR3MVoKSHNWdVBJN3NTTHUvMHpSOFdFNWNOcU1qNTdMUHVuL2ZQTmpUbWE5SCs2NjdsSHV2OWg3dWc5QTlNRHRrNnZFQ01yVVlLTFhEVVIySQphaEJVNWZUYzRXV1BuOGdicnJuUjYxWmZhTXpJNUNmSnRuemQ5UGN1MGV2bUVpMWtWdVlXblNnRmROL29MUjlPdHozZCtIenJhNXRmCjIvNThBeVJtbEp1Z2JJT1Q3WVBqVGpqdWhTTjJkSThlM2VOSEc0SjBVc0hIUEtTbkdOTEhVS1R2d1pGT0EzVHRvOEJyUWJueU9WcDgKS044UEdPK1diN09GVHcwbmZZNlVMczJvdmtkTEQzaHBLd05jZWpwRFROL3VFTk9QejhwcS9vTjFQemVuQVMwOVlxWG5ObEh2emE2awpiNmJ0SDl1YzFWbTdjYS9qM0oxcytxN2NDdnNrVGdZSlZGNnVybHlmMEhmV1hUZURyMThudDVUSlpuaXhXYjVTV2FDSW9xeVhIRnczCkN2VUw2N1MvNDlUbjVGY014Q1VuM1dsSXhHbTU3QW1NcDhiOXM2Q0ppOEVUZXp6L1dTREZkQjVOY1FMM3Z4eFVjUjVZWVhFQTA4WG8KaW5MaXNWMVAvTG1QQjFtazZkRTRpL0NlbGZQWXVwR1ZNMTFjUE1mQm1kVFh6N2lHaHBXMHM5NWRiU0prcGt6RkdlSTdyQjdDS0NwMAo2amtJczhxMGpZZ1dYVmVvMTNtTElaZWRHVU5xZHhQZjUycVBWcCs2cmx1Z2RyK0pJRnpOa0NJZm02VkdMVnpkWnJSZWlmeFUrOU44CmRBdThmMW1Tc0Q3WXBsSVIxbS9YaGxCRTdzY2I0aSs4YWwyRVp3NHZrVmU1TkhSRDVTYzNwRGF3T3FmRWZzeHBxelQ2eVQ1YlUwKzcKVUhBOWpHdmF1OWJNZHBYelBCcFJQcjJsRHpLbmZQZnExY05iV0ZUMER4ckJ6R28xU0g0dWtJMVMxUmhHV1Jwa3o3Rit4eFlFZStlaQp1NEtBSWRHNmVKMmJERjJhcE53akdUMFVkUlNGZTlncDFiMXBpRnFzRGFYWkEwb1YwYW40enNkMXpreXRrNEx3TkVqQ3FuSnVnMFI4CnRLM3N6alZQMFQySlhqSUFLTnVoOW9rTm5YcmlSTUJUSWZ4SkZWRlhSbysrUHhwdmNnK0ZDbnZSY05lbURHZHJOZWVKMmlxaFhMUkQKVkZOWnRkZ3U1Y0ZEdVczR3piUHNJS0tHSVowYVdEMjFrbHZwUDZXVjJzcDFLOGRlcHZWbUtOM2J2bmU1akRET3NDdHBLT3k3cVN5dAo1RjA1LzZrblpidFFycWR5ZlZadUhpbTM3eW5OYlRSZDlsbFR1Zi9Rd29rODFmZzV5bmtNYm8vQ0xTME85OWhYYWRqSGsxUXV5bU9QCkpzWlNuRXdkM2NXa2NKbmREL3BsZHcxdkZnZHpPMWhxRmw4ZnNNOU10aVp1NkIyY1c3QnV0bkRkU25QYnRVM25POXBpTUlFVHpZN1oKNWlZc01VZk94RnZNUUhjTFI4Nmo3aEsrcGt2WXhvOVl5VUJ0SU5FKzVyYVhTbU12YkM4UU9HaDNtYzN1a21sMVVSZncxaHpBdDJiOQpCUU9NRk9LNjFRWGkzdGJzTHZUOVR0L2ovdTBPNEcyd3Vkd3dLaGdHenp2REVUYmY3M1RpL0YwcEczZUVqVHVCVmVMdFVKb09vZW5nCkdZN1ZkT0lFWG5kUW1lME1LTE56Q0EvSW1JYUpVVzFrRDRKeHNld1U2M0tPY1RuSDA5MU1GMUF0RjlFc285eDZqbXJwWmJvZ0dWOUUKeUQwQklMZGNSdEk5aHFKN2I2R21Ic2FZWFkvVzlTaGRqOC90c2JuK0RGM3FONUYrRU5vcG91K2piM3NjczB2V1hZcnVnYlpOUUI0RQo0bHNGUmUwRGE3dVlleDVPMjFYREU3VncxQWVuQytyZ1pSUEZtU3A0b2dlYUpqaGRVQVgzeXVCZUhkd3JoTlZNb2FWdGRubHFhbUZYCkRWMDVqQzN0eGp5b2lQZURvbmpYRklNV0ZUejVqYS83ejlaS2JhWHZYWDBienEwc3ZVeW1WM2J0TWc0NlpoaDF6VUhqN0dYVXhEaWUKMDZERDNPeks4YXhjbjVSTFAzVWlPOTJYaXpzM1RUMlBseVlHVGYzUGs3SjhjT0VPTm0zcGM1UVBqOVorZjd3MlF5U25reGpKODVqdApmYVRrUG01N2pOdzI1OXpVREhhanNlN09wbWszMU8zTWRPcXJhOTQ2OTlkZCsvZ1dHeC90MEhnU3kzRFRQRlhiU1VSRDZyWTZzOWJkCmxkdUpLLzdJNmIrWkE2dFFPSFhYcFJydXV2Tnk3Nzdza1E2RnNtMmVMTnhCdlpoeEYvSndSMzYxRDN6WUtKU1VadURMSnA2M0dJZ0oKMWo3YSsrNXRrN3VsM2UvR09NVVlFcUZCRVNvT2VXaUVCa2VvV2tFM3hOU2lKTzVOLzFEdXFVenVTR3ZodFZrTVBYQmlESjFZVFpNdwpKU1dsaWJxUGg2U0dDN0Z4ajBYSGVaekZQaUoybTB6OTJnWUI5TEdnMkY2V1N3R3lIaVo3L25NZXgvWlkrTlFGSVB4MFJycjdtUEkrCmhCWEJLSFVIaXJqOHZRRXU4bHhGdVNQbVJnVGF6UUFUR2JhSDBLMFF6ZVp3Z3ZQNGlLcy94RHJ3VDY5ZlAzdjE4UFhoOTBZNmhKOU8KbDRnZDYzSWg0MDl1dXNhUTlTYzhIcmV1NGUvM0hyMCtHUXoxRklLNkQrTGZnMC9WQjZ6KzMrc2Q1bFRVaXFrQlRyZTllNnViT0pZegpKY2tmM0lQdSsrT2Z2c0J4MGpjd284VlRzeEc4QjBrNzlmZDUrZ01mN1lGN2pvQ3h0M2Y5UFZtSGg5M2pqcHJkWThrVExnTi8wOVM3CnZ5Y08ra0VTbEh5bTlDVFg5MU5QVC9LRFpsVDU4WUgxZ1FjYmQxcEtucEdJTmhhMU9rTVhMelREWHFuaDZjSWZGeG5pWjJoS3VLT20KM3lXbE5iMmpmUm9IbmVlTFBGVEkwblRlY2RGbzREQ3M1eHZDR3hLeEJ4dlhMVGhNSWhaZ282WHpUaGFvbWwwcWw2UkNtRFFWMnZYVQpFRXlSN0svUVZuZzdKRDl6QkpNRDZudnFzMkl3ZW9Mb0hhMHlOYmpLSHFwaVFKVWRjRDZieldRUG5COHRKM2ZiL2RUTUp3cGNpYWF2CkxHWkljU2o5YWtxUHEwRmR0L0FmVTU4bXM3VW8xdjdXZ0M1ajZRRWh1NUQxbml0eFg2YW0xZldTTHBibGtaTDNaVG9ockU4cTVmRXkKUGZwVi9iZ3lmVURsQzhyZmVabWVWdTNwNWNjR0wxUm9Vb0pMWVd2aklpcDdSVW9DWlpkck1SSmRWTGpwcXpHM0MxazFYVStheTZqSgpWOWpleCt5S2lRYmIxZUJ6RnNQVFFITWRNTmRDZDZhR2xmUEluWDNjVG1NNUFNbWRSZTRvVUc1dHhscmhQNVBOeEJ0enFONVpFTWRzCmNUekIxQk9IenVVV3orUEZiUS82Y3owWlovRis3WFlPdDM1MHcwaVBFdW1HbEhCYXBqRi8wTTRxazNiYzdyemtzMEplT0EyMm45TnkKd2NmeFNPazJwVHFOSDU1VXppdzgreko5WDRVUExVOXQ4TWsvMDlPci9xZHA4REVPQXAzaXp1RHBtVnJFdGZxR1dxNngxWlFHVDlJSwovbUVxMmdTaGhCN1QyREswUWplN2I3anF2TXZPcXE0ZWg5eU9icDZMSE1SNWlFTnRMMFQvWGVRaXprY0tzZ29xTTduZWNSSTFpSi95CmtzNVBvcGxjT2xmSlpvOHMwOEJZL0tmUDBUMWYyU0ZEVGdFd3ptR21NeWJ6R0xPSmo1UVRqak05a1FGOUh6dHFaWHJmbHg5UjNzdmoKUHFyODJPQmZvTUVQaVU1NThzLzdHdHpqaHRPWldhVHM3RGhtdzVtYVZXU1hPWEVNczZIZFJzMGdMaFc1ZTNzMTB4TUJJU29ZVFJaNwpVTGxPWUhlNmI5TFJRbHZ4Nk1xK3AzU1VMSUtra0dsQXhpZGFRckVRRTUzWGluUUFLNEhkVzEya3dBb2t1cTJ6Z1IzQVp0UWpCdGVwCnNxclVmTlpaZWRGa2JPakdRcGJnVzUzTmJhM0ZGN21QcGZNcmQwdDFNQnVWcDRrYVZOZVRSa1ZvMUc3MkNzbXAwRHI4S0lMNDlrSTUKejZhaW51RDV2U1ZPTi9ISlpYbEttWjVXN1daOWFwbWVYdlUvVFlOdTFybzlTejU3bERsYjdySXNPbVJqdmJYRVhTc1RkczFNMVhXawpqV3FsZlNwWWFxNmp6REs2dG1DVWdra0s5aWc0cytESVVpZVdnc3h2bVg1TG9lWFo4MjdSVTlYU0Q5ZmkwVlJUQTVFL0pmWHdhZkxoCmxuNjRZOGNuOHpLNWg4bTlTOGtnNUtFNWxXNEhJUG4xa0YycnU1SG9RcHJNZytUdW83M3J5QjFIM1duVVhVYWp3eWgxYjlFME9vdDIKanFKVE45R3BrK2dSLzlCMDRpQjZ6RDIwY3c2OXp6TTBQZVlZdXVRVWVvSWZpTEU1VHkwM1R5blQwNm85WW9tNlVLYW5WLzFQMCtDUApIT1JIRHZJakIvbmJYWjkvK3czK3lFRis1Q0EvY3BDLzNmWDV0OTlnOTNWZlBMbnU2VVM0eWt0Y2F0am91bDYyd29RcVdlWVlLS1ZrCmRYMkhHZEZURi83Z24rc0ZyL2xuYmRVYzZNZ3NFOUloaDZ0WmVOam9Sai81eHV2TFBlV0xOVndoYnYrUWxxczE5UHhPNzZteHY3NUkKcXptdU9GTTR4YTFjdVA2MFJydStsQXMrLzVIOGlXNy9lTm50SCtIMlQrNzJiOW5FN2s2Z3liY25FT1ZIQzNlczY5dXpjdk5oUlpzNQpoU0hqNTMwK2x6UHZrRVloZDZESmJIRHgyNFlUUHo5NnFaN0gyYmd4Y1R4R3JneWdzdkhreGZIVXhaUHlOOWRNVDJKejB6TDdkVHVYCnpRVWRpdjM0N01aV0sxeENRaGdXd3ZPNnRPTnk3SlNhZGk2UHAvRG9TV2Zxa0c3R2s4MThhb1dSa2FXMUtxY3BLZU1ZYk9FOTg4SmMKYVhVSmlYblI1cnhzYzd6d3gyWHN6K2RyVXFOTDh4d0RXeE5aU1p1Rml4eFF5em1zaTZFNkRjK1poSWZXaXV2NzQzemM5WHJ2ei9JcQpuNzF2UHBFRlhtU0E4Y094bzNlR1o3eHc0bEhEalJxTWNYTFk1ZmZoSnNzWmJ2SVMyUE1FcmFwN1AwN2JmRS9ybDkvaU1vaDA5ejZUCnY5TEhRQ2kvRjk0blBOWGpCVDUzVEFMdk1IbEV3dnRhL3dCNDRyNzlGdkd3NXlwMWdPbnRlTVBwRno4NHlpOWRtdXRwTjljTlp4WlAKTXI2T1NaWjBTN2hyYVY1N2t0YzhISSttR2M2T0U3TmtNNlJ2Q09mcnFWelhsc0wxMnVMMGRON1NQYVh4eHBFcVhxYTZWd3pLczlGWgpkYlJnNGp0enlYZFlUeHJpaE9IQXF0T3F3Y0F3NFNQbTk4N2llNVBoQ1RNZFdXTWNwbWRJd3l4djJWMU84N3VNR1Y0aW5lOHpYZktlCjVXWE04eklFa0V5UFJaQzBzekU4Z0tSNkFNbm5ndE5lWG0xUGg5T2V6TzBQelpXd1h3QWZjelgzSXJsdW5wSDlJSVdRbU5CUnJ4UnUKdGRaMXpKazUzTzVETHZxMGRWWXZMclM2U3c3Wk1xQjVEclF4RzdQRFJVMnE0dUNmWlg1MitHb0hjalFJcTE1dzExQ3Y4d0FONlpmNgp4ZkxEQzNaNUJHL01FNXk0Z0k3bSswMjJVdlFPajV4RGVUbDcwRi9pZ2k2Nm9oL0cyTWpUYkRtWDh1V0VDL2x5TEZmTzFBTE1YS1B3CkVFY1BhOVFkYTFmbEF4THFXRURqN1k3VENLK1o3TGdkanpMMFdMWFlZOVgwdnYwZStlS2Q0bnRTOTdTN2RjNDJuY1RGUlp0QWMyTncKT2o2MEpFWmhEWGM4WkdqajZVTHBHS1FQYjVrM2M1V25pSEpQbkI2MDBXeVlwSWs3Sm4vTXdnSm4yZ2MzbVZSWkpsZVllUFRQVVdaYwpFZmFkWkduZU04cnRta2Y2WURMb0FaR1hKYXNubks3NS9jRWhsaFArTkNQODhwL3d2bTA1RGFrY1cxNzVob3QzL05aajdHelAwQWg0Cm4zWnBCanEyZllTdmorRDBFV1BlY04zSzVOSU9kSHNoWC81NytPWXA1MFFXcTQ3OUg0RC9sNkgvYTN2VnNvT2RLZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJVUhISW5abDNHUno2OHozR29FOVpkTVA5NmhDTVdMd091K3Z3dXZNUWhRN05aU2JaUElLRVRuTEtFaDMweUU2UXovWUNRSC91Sm1KKwpNckUrTjhUNEpPSjZBT2U1STRSbklXQUhJQjFnY2hKeE54dmhOSURKQU4raVR6YWVmZnhwUngvclVhdlRwNXkxNmljUy8vaGtIL1ZrCmc1aTR5dFNQVlBERHZGSEJYK2Q1Z2NSM0pjc2paUVpIYVI2cjh6OTZucThxa3R1UXkvOHpONnVDNVRKSDVnVFBhd2pNUUNiZEoxMUwKcWJHbzhTUWgxWHU4OEVkcmNvMVhtNmpRdzVOKzFtYlZIUE5wOW5Gdk1seGg4LzFzWnZlVFpyVlBaeVFleFRzTFYrR0w1VENuamFNegpyMVZmbnNuOUwveHhVWkQvVEExK2twQy9YSkx4bDUzZG5HbVRrTDJuV3BMMmV5Wm9kK2FJOU96M2xwZ0g3Rm1USU9zZWVXZWJZaklsCkhOdmVOcG4rZmR2MDczRGpCNU12N1hnVnp5L2VEbFlaejFVWkRxV1NoVHp0VDZNNk9ZaHFmd2pWaUFQZkgwQTFIRVUxcGhwOC81bDUKVHl2MzA0Y2RhZlQ5NWEvZm9OcmxOQlh2UHY0Sk5qZFkydlNjZEpYeVhNSTd0a1JXaVZuaENwTWkzOWdHem1oczNjRWh6MW5TcXBaUApmTEhzYkc0NHVlRXVjVzlJMzBpVHlkTFNxUkh2T3pWemlhWkFtaTF0VmFUQkJJNXdUN3hXTGNkWmoxanFnTnJCWFhLU2pPejByRy9tCnU3cGM4c1d5VEhXNVdOYVBMZFBIWC9xWkd0U3AwYk91ZVNvNlQ3V3Y1MjE2WXNOaS8yOEQzVk0xdzhDYlBNdHpwTHRqVE1vOC9vdmYKWTVMcmVVaDNQUUxabjRSMy82aWZIeHQ4d2dWMkNNWXNxL0ZHQkhtY2hvdHpjR2VlZm52a3FiY1E5Q0tGUEloNEVQQWczaTA4em5ibQpRYmFRN0VhNWpvaVZ4OFM2UWJCcm90MnRJUyt1TFl1OG56M3J4MFdrYVRqRTIxUGo5NHo2NHltejQ0bmIyOW1VYnhraDkrZlZ2LzlVCitpY2RXdjE5eDh2LzhHUDUyUnRVVTh5Tm5RT2RhWklad1YzVjBoNW8wb09XOGVEOWg1cE03UUNQZFc5MDJsbTRqME9DSkxkd2U1S2sKMGNnZDZqeVpwZnZlOHVuZG1yMzd4bXpleHhiNzZSdEpUNWpaZjRhTW45TkozczNscktSSFNyeGNwa2UrQ0I5YnBvKy85RE0xcUZpSAo3aE1ZdlFMdUZ3aG5DQWpIUDR3SGovZmNlQ0kzeGwxYXZKNGsvU2taOGZZNThaajV5ME5YVWl0ajlNc2UrWFVTU0hQeHNNeTc2YkdvCm5EUHN5dFBLemZUOUlKY1BLMy85QmtjRDMxOWRLdjRoR255dmJqRTk4c1hsUXdmT3M2ZVBXZFNwRlUwWGp5Qll6N0pMN2pOTWhyT0YKNU12b09Oa2EybXp0ck9hTlczYkhHZGtCRnhkUzNJUVRiczhrLzJEM2lSYjVld1B6cWswK3lXNStMNDk5SkNkZmhYZkhxdnZLWDEwcQovcFFHTDZzSXl5TTZoV2tjMDVrS2NxYXNuR1JVSG1GaFhmdHBHdEhVMGtENzNxVlpwSFYzVVhsSGM4M2VHQmo2U0Myc1dDTEFoYUplCnBLQUZoTUx0UktudnhwTCtGUU5DTThXZlpmYURpVStCenpEd3didzNFOTE4STFxanluOXExVlBoN3pnMXVZOFNuOGw1a084ZzFVR00KZy9CMlRWMERjbGo2aTBmUy90amcyYzllUDdOQTQ2bDk4TE4zNG9uQ3QxY0VIUlNVMmxFK2UwMXptd1pWczU2b21tV25wRm94VmVVVApPK2JzNXkvUzRQdFZnOGVPSzdReVhUd1M2dlJNcDFHZGFWck9XUzlTSzVvTXVUa2VYbkF6NERidkcyQXJ0R1I2eVE0Rlc0ZVVlcFlEClVKUHF1UmR4OUNPK3o1TjRudEN3cHpQa1FRSmI4eHJ0ODNqZE1OTk9wR1VKU2ZsNURxR2VZdm5YbG9vL3BjRkhkSWRIaW1rYzA1a0sKY3E2czdKV1pRYys1ZEpEQTFNOE5zSEswckNMOWVJQzdJYi9JM0hLTXZDZkx5R1BlMDlGMzZtZU5iK1l4N1FmN1JUdGNYQS8wdTU1MgpwdXhvaHV4S3Y5OE43ZGVCbnI4c0R3eDd0VUpLL3VwUzhRL1I0SHQxaSttUkx4NVhZTzR1NlR4ZEk1cUdMUHk5akFwVlY3TThKMERYCnhWWnpJNVNlcG44eUphNGYxMzQwUmU4OFkvOTRZbnNIK2EzbVNqRG53ZVJZdjdQemNmVWs5blYzTnU3TjNlMEo2cXdJUndJK1ROZ1cKVHU1dHVERjM4VUhEejlsY1BhVmU0YURmUTFtdVFpNkRVKzdUbXFGcks4OXhJNDU2RG5IbGNUekNNMFBXM0k1TDJtSWdtaG40NnRHWApGOUpoS1ZmQ2x2dkRmSEpMZXZyUkI3MVNMWWU0WEpYZGMzeDBDNS9rVE11WG5HbDVoMHk5aUhzNTNhK2VuQXgyV1U0Uk1LY1ltRENjCnc0cjhUME9XV3o4bzBrOGc4bi83QVlmNzR5RzdpSlZPUDA4NzBXQTgyZkZVU0lEQUpjSldPN2ZYTVp3ZkR1RTBkZkVrSCtwMDNCOTUKM0pPcFAyWWZKQ0oxUEwvaGZqaG83ZndBaDIwNEpHMS9oTVBTam5DSTA2T25PSFFOL0hvd1QwSFlEUHU4clpFbmlNMnhsdUtuWnEyegpMS0RJdUFJZUdCOGV6ZFQ2NFJmck9WdXlKT2gybGpteHhHSlhWbzlaMkJUSGVobVcraEhYZnRwYXV3Z0R6ei9pd0gvRWdmK0lBLytzCk9QQjF1N1RTaEhvV1hSU2VFRjMwZUc1NjArZytzMG1tN1RSUG5HMVBTT0h0azdjZkYzUnI1Nno2a1VIOTBLRGFEZzFhaDhPTCtvR2gKT0JucGhQZC9NQ2ZkemNLUHVsclBTemc3UzJFMzRSNzcvcFBtVnJrb01wWDh2c2kxUjZPKzNuUHl3UTUzZkRta3JNc3U2NldwT3pUdgpGb3E4QzFoN05FNnROMWhQWXRST1R3NDRlOXJMNFdtUFQ5N0htZVZ1Q2ovT2ZaL0tmOSt6S3A3RzBwK1VKLy8weE5ZZ214SzFDNW16CkVOWkJtZGR0c3lsdWJMYk45ZE16UlUvV3lTZTM5YmtqM2Y3bER5L2VQZnpYdy9IbHMrZi9JY3RpOS9FdmNRckl1ZG5zSTg4Qm1jNFMKem5xNmFrODNPNmFhdlczSENlNXpWWHVPMlJ1Z3J1NHN2V3djOE9oN3JQemo2ZkhINVBqSGpvLy9GUGovelpEeG52ai82ZU1EQUt5MApGSkNlcVBIVTdISmlOZmtoejFjNXM2eCs5QWtyazZxcGo4d1V6OTJaN1NoS25TdzlQN0dMd0QxSHNZaStHME1BWFBpOXN3TlBuNURuCi9DUS9zVmtOMzJjeGZGcTh4ZmxoQ3g4YmNiRlBMZEFQV3poTklYRjdJVW5CazZiQ1I1eGNNMyt1czJ1bUN4TmhGNnBELzk4NEVjWXoKU1gwYURNbXEzemNWdmk5aDlUNWR0Wm1ScC9wcEFTNm5rK0oyK3ZnUWwyR0tEQk5sZXVSWWpuMDZpczhuUFpzTS9aZHI4SkpuNnRMQgoyR1hQM2FZTHpPMkNmbkV4OC9BKzc3QUZGRTJmR0ZGVU5LYW9oeFJOSHg5VFpKNkZveG9mYUhaSXQ4c2thMk9mZHVUdVF1S1JIK3JvCm9vOHgxVjA4dkdqNkVHTmR3L0k1a3M4VHQ5MzIxRzJUbVNXWXZhMGxiN3Q5VXZxMmZmSTJpMGFhUGkwY1NhTjZEYlhLZUtUcDR3T1MKaUZnRm5tRTFwQ3BBcXJLYzdrL1N3NVFMR1dSK25Bby9Ub1VmcDhLUFUrR3h0RkVma0ZUcExEL1VoMS83UTVtY2hQRFZQN3g1L2VYYgpGNi9mdlhqOSt5KytHSFR0OFl2cEg3N0JOMG0vK2ZMWnUzY1BiMStMRW43OThzL2ZmdnRNMUcvNzQ3QnRWOXVhRm5oT2wzVk5oN2dzClY3S055eDlodlpLNXRQSkpyL252di81SmZuM0hQOTNuK0s5LzVzZi9JWC8rYnlIK1NWNys4S3ZEdi8yditmQzFYdkpyK2VYMzhDWVAKcjRSNGRxUERMMGVxUDg4dmgrc3YwWFpYdjViL2YzYjk5dDN0aStmdlhyeDUvZXp0bnc4L3A4bmlaOGMzYjE3SzIvL0NldUtydTY5Zgp2SHZ6OXF2anMrZi9JYjMxMVc5ZnZIejQ2dGNQejkvOTlQQmY1WUwvVS82M1YvMHYzN0dCVzc3TlAzSTZSQndWcURiSUVETW54aUlUCm9sclNQenRBdGZwWmdjdFc1N1FkL3ZVWkc5cDFYQXJoYWs2cmpIdTlTaUxaYThmSXEwVVJ1QTU1dTFwRnBEcklpcitTcHZJaEZ4elcKS3U5Y3BYcU42WkR6VlpDMWRYaU95MnEra3NWYkR6bGVyUWdCRmNuL2FwRlZkVmkyS3hINmNYYnNlaFZrQVI2V2RDVnJMZHBsMjlVcwpYT0dRNU12Q3hvdmVMZGFySEdIUXIvTlYzamFab3VVcXdmakt5OHB5SlNxSTFGb1JtQ3QzVytVdTg3SWVVdFJuQWlIbHVoMlN2SVpJCnQzcVpFRU9vNVNERFhJT00vVnF1SUcvQ1A3NGhTbFMwSUJuT1hFQ0lxZHFycmZNVmxKTERzbDdoN0o5RGxLNEpzaFlQUzdoS290OGMKV28yVXJ4YS9LRnlKb0xxMng0NXJScTQwVFptRzVHVHJlcldFYlRtRUxFTXFnNkJYclZkYlNPc0JOd2gxNHdOSmk5SldYWEFlYms1WAp4Z1NFeWZoRjhqYnNzaS9DbGJBb2RIV3FWM091NGJCSUh3cjdFNEk4QmVaRElEdkplcDMwT1NDZWgxRHNOUlpoS1J1ZVdVWWNuU3VmCkY0VERZcnczRzdDRW1TLzlLYS9LMFVRclhCWnl6N3pLZTZaRngydkpWL0trTmw0cFhNbmZNb2RXNmRjZzd5V1hWMUVuRHVzaTQ1YmwKbGt1VW0waTdxOXhNaGxZdmt5a1hwT01PWlVXMGRtVW5DbmRlY0puc1NFS1FSWmx5a0haV21XV2h0RWtscTJSRlc0ajZQYVJaWG1pVApjYStMakxNTWsweDh6bUNaa3NMdmRjVGtzYTdXV2ZwY1ppQ2NUREtWY0RONXN5cFhaNWxUU1dZYnAzU0pPdXQ0bVF5d0tEYVJrZGRGCk9pQ2g5K1JlOHV4elR2Rnd0c3B3MWI5elFkOXl5Q3RUMmFFKzE4bXJrU2dUQy9rSU9WczJCRjNMdE1JYlJIYkEzRDdyNUpISGtxMjYKMTVHVkkwcmQwSWdSL0ZZK3U1VW9jM2RiVWN1YWtibkdGMnYzY2tLYnFYaWdYc3ZmbzdWejhtTCszaW1nSTJSWVNwSTFML1BxMVk2NAo2THhLTWl0bFA5NUFrTzFWT0lTdzJpeWoyQWc2YURMTGdxeU1YbXZSdS9aMm5HQjMwOHVjR0s5RVk1VkJhKzJFcTBWR2Y3aWJFZlF5CmY2Wld5NSs2dFhQeWJ2N1MvK1dmNUo5L2V2SUc4WXR2di9yVk05bFRiOTU4OCtldjN2dzdONHkvZi92bXUyOTBoN2g4eGE4ZnZubDQKOXU3aDY2L2tGcnVkWkR2ODVLZUhmLzJYQzN1S1RJeTh6c1FVQ1YvWjZQR2NTNUdld1c0aXJLakVQTzRtUmMvbDF0MWtxVmRseTdJeApZc0VzT25NN0Via0o0Q3FWQ1NKNnYweGxtU2hWZUt6MHN0WkFRbHdSOXRoRlFkaEtCRkVtaTE0bXF4RlJCNGVTdGZGRzJLd0dMM05pCm1EZTdMbUtYbHAwNWhOVW93dnZXdUEwVVhybllEdDdyeWNUVmVuUFZCMnVVcmVvbXp3dWRLRXlHODd5OWNRWEQydzVuM2JKZjcyRkIKZndnVHFWRzZWYmpLcXgxUjVBOXdyQ0RzY0JHaDF6bFd3RllqbzJJZjlRMlF2M2p0VmRDRlNYYWwxa1lqMkoxYVI1TVlaREFyN3VUTgp6THBNMjYzbXZtejc0N1JLL3NDdG1aUFgyazM4M1pSTGFhNExrR3F6N0E5MERzMjVoTlV5SGMvTTZWblZ6eTUvYkl2czJEcmhvdXlkCjdORzh3QUdibFZWaTVRSjBsNE9JRmNKdjR5emY1aXdNR1ZNSzIvVXNlNDNzQjNqV09SaXZuSVU3cjdLU3VWV0FXd1ZoMzlqc3RrVzIKMWlxYm42emtUVGFmd3lhN2dFZ1NlaGwyQUhtNVRaaURNUDREOXpYWmZUWVJla1M3a00vQ0I0S0lNYktIYkZ1MDdVaUlKVmZkUjRUcgpIQ0prRzlHWTBKc2l6SUVnMWF1SUc4STE1clRZWlVKYzVJME9zdWZCOXNtYnJWVkVCOWxFNndLSjZMUS9UbllXTEE3c3JYTGZQTXY5ClgrMkllRi9zeFBLZWVVbWNScGcxVVhoY1FKZmI1K2ZleDZYR1hrZjJlT1FvNlkwNHdXNmxWemxSUmxpMHYwTnJwcUJybDdYZnl3bDYKbVQxUXIrV1AzTm81ZWJIZFhBdUg2MjgrbWJVRlNJK3laVUx3a0wxZkYya2paaGtsR1Z4NThxdFFaYTdJc0ZYTVlQQVNVVlJySXlpUApFc2xZNXNCUVMzcHhGY21vdCtNRXU1dGU1c1J5QlFYODBOc1JrVG5MOFBlN0dVRXY4MmRxdGZ5cFd6c243OVo2VDNVcjl0NG5yOVVnClV5VkQzc1dVRWE3SURvU09nRTEzbGJFUmVUTUlLeGZobFk4V1NzUktGVFlqUTRTbHUyRmg2SHlRU1FaR0s0dzNZNWFMNUhzVnNaNWsKK3ErekxJeFE0VUplWXlPd0l5RHJ6MnV2Skt1R2ZEc2w1L2RHRUkxbDRPNUdGT0ZsWFdYMUJ3aVc1T2FMWFNiU1VDM1lGSVR0T25zUAowQnVLek5sQVhzUFdSWW9xM0hXeUNyU2RFbVg2TG41bG80cEVEQ01JZDUwTjR3S1dDbmZJQWExdklsWjJDcStVSFhhck12eTluanhqCnljdkNMWS9xeTBBUmpXRUwyYTUwS2htSWFGL29yTVRueDVyTkFUckJDaTgrbmovb0lQRktXWEdKYzFqMnlCWHlqUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJak8xVldyRGJ5R3ljWlorUVVmVjlOSlRlUTNHV01STEd5dWxIaFV3K3lBVTFzRjdCcXA2dEorYXRiNXdjZll4am1JRytBcGg0aGxKUQpPQUJsa1hVZFpIdEcyQnk0Y0oyRExSLzVzS3p5Z0tLOUpqQi8yYVNrdTRUamI3UGUvM1NHbm16VDBCMDRTUU51VTB5NjZWU0loL0xXCkt6aFlVVjVBMWgyRVhTTUhTNmY0QkZuQTRZZDZVVjUvRFVOVGpXQjMxQXNiVlRvaUNUOFltaElwZEpWbE05elNLSHBsZTdSV3J6MTkKYSt2MExiMFhSRFBWM3NHTW5uTlVLUjFqV3pPWWlGTkZEeGJCZXdaRnhuL0xPMHBSTFV2SG8xR3hzbW8rREczSmVnZ1lrWDVQbytpVgo2U29LS3gvcnlTNEwrTlhRVnFQczd0bW83ZGxhVyszNVQ5K3o5WUNzRXZhTktMTFVURi90aUVEVVo2eXdwTDI4VkZYQ2crZ0dDYlBRCkNjNk1rSFdtMTFxckRtdHJweEhzYnM5dHVpa3h5UlNCbU52YWlmWkM3VzVHMFBYdHo5UnErVk43TzZmdjlyaTA5aW5tSnVpSXM1QkgKK3hMWUd4UXROeTlCSGNpQVdMcDVLU3dpZ1ltV3RUTXZRU2lWdlc5cjVpVlZHSVFMdUhrSkl1bzhMOHZPdklTMk5naHNibDRDcitUZAozTHdVYUw0UVBqR2FsOGd0d2ZQY3ZDUnZmZ1h6ZFRNdmdSRGozcm9VNHFKU25GbVh3RjFsZXcvTnVrVFdKMHJIenJwRXZpbkNZN011ClljT1FUbHVhZGFuVjZOWWxzTXhscWYycFF4UlJhS3RyTXkrRktITi8yeG1YUUNwVk9MUWJsNW9rNE9ZbHJMQ2E2cll6TDRIeDVpUjgKdXBtWFpCRnRFVlkwc3k1aFVjbnVzVE11eWRMTE0zck9iRXV5L0dYZVJqY3R5Y2UwMENqWVRVdmdCd2tIcEpobFNacElhZDNjc0NSOApXd2FxN094S0ltWXpNNTZibFRaS3lLVlpsV1Jud0p3ZGJVcmtmVnNKemFhRXJvTVE2U1lsdWZjVlhBQTdrMUtRdTNKSnVVa3B5SFROCkFDSzc5aVhjbHJOMk5Da0ZLSytsVzVTd2ZjNTFYWnBGS2RTb3MzaTBLR0dub2xqckZpVzVyMnpLOHNodVVqcGJXQ2Q3RitOdHdySXoKS1RXaVc0TXdIV29XR2RqTVJTRXk5V0FlVFVyWXJTS0VPNjhUWUxTRXVjMGJjY0pvNU9sRU13VzFadHhZMU80MW1wVGFBL1ZhL2g3ZQp6dW1MamJ4YTVLRmxaMUxxUkRNRmdTK21MVGRia2NpY0NKdmFkaFlsY0ZTRSt3eTFacjFwYjhZSmc0Mm5FODBTMU5zeFcxRy8yMkJSCmFvL1VLdmt6dDJaTzN1eHYzYUQwOGRxOUxQQll5WVhNT1BkcXBNcFNwb0d1dVJGazR3YW9WQWhCcHd2WVVNNW1PWVpLc1VScTVtbWIKNFQyUWpoWkpFWmZsWk9aSmJzVlNRN1lOZHhDWS9SL0duU3lNcEpueFJjWGdXaFIySWs4ZFF5T29CUjRDZXVtVllGa3ZJc0xYYW40RgpKMnlidHQvczd5QmlOY3dySGxJMk0rRTRHMVVFQ2lNd3hzWjFJT2pMVmRFMnVJUzlXdXU3WUNicTg5NDhNUTZVV2UyYjJBUkVDRkk3ClZLY0tVeFFaZmxFckxqMEhNWnB6QUh4eHphRlR0T2ZnaEVqcldDK3FwMkJveXlsK1R6ZGJHN1dZUzY2MUJkMkpvOWZ1NlJTOTBwK3QKMWV0djVXMmR2ZWNQSXVvMEl6L2szSFhkbHIwdkRTb0tPWGR6cHFHZWFQT2xlOU1nbSthOHVsL00zR215VTRzSWlDdmRueWJhdmV6RAo5TERaU3NDMkl2SjkzbnZVS09NbDNxRzQwTG5xM0cwK05XZ09JaGI1bWpHbkdsVGN0V0FTdVZjTjNJM1AxdHhxMkpPNmhjdjlhdGk2CkFxWjA4NnlKdkNDRG4zSjNyY0VLSUpQZGg5QThaOURHUkJ3czNia202MEJ1empYb2RXQkJXVXk0Ynl1enZZTjcyS2d5eWExR0YxdFMKMTg3T3gwYkpNeSt4T2RuZzJscmt6czNMRmloNkxIc3ZHNVZycUNITnl3YlJVM2FqT0xqWkZuU0lTUUhkenliN21MNlJPOW9DOWxFWgpyZVpxbzdraEIzZlFtYThOTDY0K0ZYZTJRVDNmSXVhM3U5dlFnZlBpN00vOWJWUnZOcnlqTzl6aW5DQmVidDNqSmt4VUpCL2JrSnJMCkxkSkZVa1AzdWZGS3ZHOXp1c0d5Mm1hUE85M1FYQzF4N1Y0MzJDbXBwRFMvbTJ4dElxaVpnYWM1M21LRVJpZzdaUE84UlhER1FLZWEKODdVdzY5emMrZDVnRXFLWTZjNDNLSmVMOVBmaGZHRSs0bjdEOTF4V3IvYlVLaHR6M0xvRERvWU12a3h6aXpYS3pnazMxRE1IMjlCVwpvOWc5ZDQ0NE1JS2E2ZnkxdHFESTBzRGI3dGtvTzEvY1VLODlmMnZyOUQzUDNIRlJ1aXBMcCszOWNUREFjTzQxNTFjTXN0R1cwRjFrClR0ZzU1SG90MjMrR2hockZicmh6eVdHRU00VGszaFRVa2hDSEd4cGg1NVBydGRxVHQ0Wk8zL0QvdDBKVVNFSE5sU0hCS0dqVEdic2gKOVRwOExkb2hkdFlaUmpxbzM5S24wR1JwYnlaRnVCOHBybWlxZzIxRnZBNGxFV0hvQzJ3dXdpbDBMc3F0MU9EbkZOV1lrbnIwZWoyNAozQ2pHZzZQa0RRelJlRmJJWUwxK3BXZzFkcVZzU0x5blhEa25tRzFnSk1WK2RQYWFKeHBRZ2o0RkcxbWUrM1k4VUlOdU5tZ0hGbWxZClliZEE1ZzRmQTh5VVRsSE5SQlpQbXRlaG5uQ2VDald2TjlVcGMyYzBuU3F2b050M2Eyc1JkaERETXR6VEtjOXRKUGxvdlpvL2ZXdnEKN0MwZmwyMCtoNThYL2h2T2daMmpGM1pjSFYvMzlNS01QOE9EMDF5OVFRUWgyQXIydmw1YWlubWx1M0hCTkhTV05Vckt3NXhxMU1YbgpsTHQ3WTNiTzZPN2VSdG01ZTNzOTkrTkdyb0EwVWxMcGs2cFRNWlI1ZFBCaUY1dXpqZEcraHg3eCtVYUl3c2pwLzJwUGhROGdydDNyCjIzWk1kOFkyd3M3ejI2dTVWN2MzMVNsMnk1MzNseHNyRmZqV0Z1UmpXdGI4bGs3WU9ZQ0hhdTNwVzFPbmIva0QrSURCcjRRdjFMMlcKMktpdUpUWnJvR3VKbUJZMHFveGFJcmlIaVBxeGFZbFFxRUlWSnVoYUlpd090QmVPV21LejQ3bVcyTXh4cmdEQ0RGM1dXSFphSW5TLwplVkFsWVNKYlpESzdrdWlmUngzUmFVMUZoSmw2aFgrdjZYNzArS1Z0M2V1SXNHS1ZCYy9XNnJXZWN4M3h2QzlQN1VpcldpeDJPbUtuCnVsNUhzd3htVmRQOThNZWFjdG5yaUxUNnBDVU85VUpWbTE5dnExRkdmVzJnbWw3WDIzTGRyOTl6MUJIN3MvVjY3YTFhVzZmdmVkbWgKL0NtbThDVWJMQVdHWnpoOVgrMnB4WlNlWlhFbjRhb2FCRmJWREptbFVkd2VUZ3ZuVUE4N09seHp2YTFHc1hzNjh6RHFabGFFMXBacwpSTUxGMXVHZVRuRmp1cmtxVzczMi9LMnQwL2Y4UWJ6TEVldVU3bG5aQ0NqZVUyb1h0V0VyaEJoRkZSeGlvaVc3ME15ZmtDb0pYTHdVCkd2NEIzZGdjMXlHVGc3NG9HTlJqVUxhcElvZDBzR2hKa1dDRkxVWjlXZHJtSE9RUTRYekVacXkyR01JZXNPQ2djbUVxUURMVkxvZkcKMkd4TndLbHNVUkU0OHJLSnV2NmFpbDVadG5XaGQ1V0dYdlNyZEpiTmFhajRDVzhsKzc3cTNmQjBWVkxnaUlZT3Z4VzFHMEtJRXYzUQp0RHRSNFdUVENIUitLNEIycHZ6SHpVOEJ1Q0ttdzl3T0tTeTRnaEhBVm1HdkZxV2JMNENkcDlMbHVHSVJWY1Y5cmh0VTJES3JmcXhhCnN6UnJHbXlBd2hjelR5YUhaNHNXY05qVFJPcE1ORHFrNUpwdnB1MS80V05WSGNsRk1RSVVDbFdIUEowREo1cGRYQlUvZ2l1V3NoaTgKdVZQZGJJQlpRME92OUVrQnNKN2FxYnJpamFKekpDa2VaNmdubTJLb2VXeXJVZXllZW1XakpvTy85cmFpYnBYRFBXUGZQSWRuYS9YYQo4N2UyVHQvekI1RUNZM1pBd0Z5NkZOaW84S3BUR1Y2Q3dlTjhDV0tZU01oWGN6UVhCeVpVWFdGbmhTMWxVUnk5eW9Telh3ZDFrZjVBClVkcWFOQVpoczFEN2dDaW81Z2JYUHFDR3VHNGNYVG5vRWlCOEw1aW92VjdaSENxNDZSMDRLeFc2c0kwU1lEbWhnaE5xWDhpc1ZIbTEKVVdUWk5BbXdVMHR5R1pPK00vaWRrVnNtY3RvckRyR09Jbkl4R0FxTWZmcXdxeitzL0tHM3JMTzlwbE9jTjVRZFZlMkYyQ0ZnTHd5MAp3SGxiMjZBOWdmdndZU0crNjJ0dU5paUFYT2lnekI0RElHd2orVDA1ditlbHFqMUlybEsrcXlKK3RQVUxOcHBpcG9tUUJrMi9VdGxJCkVjMGNGclE1V25lczJhMHIyYlhCMlBWUzJxd1dDQVR3OE5MRUhseHJCRHVsUVFES3JzNkQ4V0VYUXdOU2g2UTFyczNzYUZQMGZLNmYKc0JaTVNRRFo4REkwbmIzYVUyVnJxWXVhUE5hbDZsZ3RzRGxpYzlDdWQ0b3VCK25vQXQ3WjZ4WDFwUTV0TlVvYXpIV2RtbkhVVlRnTQpiY0VxQkl4OHY2ZFI5TXIyYksxZWUvN1cxdWw3Tm9lYlRGdDZ0ekRmdVZXOTJsTTNOV01DckVLM0dPd0htWjZNRldoSTRsMk1va2lICm9OaWRvWjZzMTVoM2JUV0szZE92TkdveEMxZHJDLzVTbURyN1BaMmlWL3F6OVhydCtWdGJwKy9aZWtBR1pzdllja1g1SXl6eDFZNksKcmJuUVhEKzd2UVFqeWIyd0VnSFJDTDdpWjdyL2U3VUZ5ZWJTMEZTaitDMzF5a2FGK0VPZm9iY0ZLRVVKL1k3MldSbUZQNWRYNmkvawo3Wnk5b3I4ODdLMlZxQytndXBNNVhBZnFBdWxYb1hvaVRLcWpnWkkxektLeHB0SXB5bnRnMG9DSjNLa0VkZkd4dksyQll2ZlVLeHMxCm1tRFgyNElmQUs2SGZrK2pQTGVudFdkcjlkcnpXMXZuNzlsNklNRzlHeFhQSklxTCtjOGFGZlkxQ09IZ2hETm1uaXczaW1vQS82WjUKQzUzeTNNUVN1dmlIZW9CQndEdlltbW9VdjZXTENFWTFxMFZ2UzFnbjBKVDlsa1pRRjRFOW1GZnFMK1R0bkwzaUQ2RFBOd3d6ZGdwNgp2SGFnYm14VkszT0pPcW9iVzlDYTRTaHlXRGRNRXFtNi9kMkIzUkQwMWF2Z3lHN2dzRFBzYkEzYUhVVVV5RnNOYlFnQUZZS2tDZG5JCnNkM29LSFZvT3JnYk5WTjJINDJCdTJrR1dkYWxvN3NwNUFCMjB1RGQ0S2RwTzRGMzQ4MElXR3I0YnRqRjdFYW5uWE82RHhrUUduOVEKLzlwQnZLSERKRlZkREZMTm5Sclkwb2E4YnBUbjN1M2c5ME05dzNBUGJUbkY3K2xxa0ZHcjltSnJTdTVFSDJpL3BWTmNFdFJINi9YYQpTM2xUcDI5NVdUMy9ISGh2ZXIyaW96MDdWVkVhRFZ5Tk9TV1RaK3NZN0VaUmM0VkJ0WWQ2aHVidVRUV0MzVkV2YkZUWnhWZkNhbHRUCnhlekEvWlpsTUJmM1IydjEydE8zdGs3ZnNuRXptRzdoN0lQYUxwekNzQmVOS2dKVW5nTWlBa1hJS21ycEMrWkRuR2NQL3dpMnNjSm0KVzVaMUhlcWwyWUNhcmFWRzhUczZVMUlxVEd4QWVmVzJNS0dXYmJ5blUxU3MweWRydGRxenQ1Yk8zdkVITVUwMFdESFdFS0hVSS9TZApzaGhOaG81OXgwTEppVjR1QTc5RHgra2hrSTUrcHljUExLREIzeUhuYkNYR2puOXZGQlZ2RkFEZnF6bTJIY0syMmNDZHNvVlIzekVxCmVTbms0UWFDcDlDbzZvaWg0TUZDbTJ6ZFlQQndscXNLNGZCMjlENGx5RTVaWVdEd0t4dFZwSms1MHFkaE1IamdlK2ltYnpENFJsSHgKeDJEd3ZaN0QyMk14cEVHbnVObkJCU2VqaGl1Q2doMEZIK25tQVVUQVVmQkE1cXp0WVIwRkR6ZUUyc2tjQlEvM1FpcHI3aWg0NkJKZAorWEFVUE56c2hFODBGRHgxamhSVHg4R2o5YVo4TkJ3OFVBZTB0emdNSGlOQXZ0cHc4TmhJa0RqSEJDUUR3a01SWCtzQWhNZEd4V2M0Cm43SW5kbUJIaVdNUUE0SXBYdTJwb29MaDZPS0dPT2M3YndNVzNnaytTWWhmNzdVTTRqNDAxQ2gyUTcyd1VWMnhhMDBCT0JWSDlIMmoKNkpYK1lMMWVlL2pXMXVsTE5rbmZJZUtBZVMzQkF4MGR2dDZvRGVLTzJVOW55VURKUThoSHA4SndCY2RmYnd1Q05tRS83WjVHMFNzTgp2ajdVTTRqNzBGYWo3TzdacU8zWldsdnQrVS9mcy9XQXc4VXhkOHJpMXV0T0ZSWkdJSXdEejBXQXZab0pyM1o4ZXFNNGF5S012ZGR6CnBIdHZxMVBzbnMrbkFSRlAzWVNHbE43V2JHL1c3MmtVWGUzdDJWcTk5dnplMXRsN1BpN3hmZzVjL0E0czVzRDRoaFZyeVBpR0ZXdlEKK0IxV3JHSGpHMWFzZ2VNYlZxejV3M1pZc1FhUGIxaXhobzl2V0xFR2tOOWh4UnBDdm1IRkdrUytZY1VjSTcrRGlqV1FmSU9LTlpoOApnNG8xLzlvT0t0Wmc4QTBxMXBEeURTclc2NHhRc2VhZWE2L1E0UElOSzlidzhnTlNyQUhtRzFLc0krWWRLOVlnOHlOV3JFSG1HMWJNCklmTU5LdFl3OHlOU3JJSG1IU2ptcVBtR0UzUGMvQTRuNXNENUJoTno1SHhEaVRsMmZnY1NjL0I4dzRnNWVyNUJ4QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJREQ2L0E0ZzEvSHdEaURtQXZ1SERHb0oreEljMUJIM0RoelVJZlhkak80aCtodzl6RkgyRGh6VVlmWU9ITlJ6OURoN1dnUFFOSHRhUQo5QTBmZHI0V1QzMmdCam5mNGNNR3FtRzZHbmk5NGI0YXhuMkhEMnRRK0Y3UDBmSzlyVTRac0ZvRDFUQmRyYTJHKzJyMzNPSEQyck1OCjlkcnplMXRuN3preWYzcVNkdml3Z1dxd0xvZXlPL0NyNGQxSGVGaER4ZmRhaHBzZjJtbVVBYTAxVUEzVjFac3k0RmUvNFFBUGEwL1YKS3JYbmJ1MmN2dDhsOWJKN0VtRnVFeFpoOXA1R2hTV2hxSlNWeVZBS29qZk0rbElEVjZOUlZQMTNMdC9yQ1pkS1N4amJhaFM3WnpNYwpLRlZXRkZqNTBKWnQrY005QnlGZ2VEYXYxNS9mMnpwN3o3WWVQa1hCUGtuWlJLMHVMV3FjS1ZqeHIvYlVvRkUyc01VVUlDWXhXSE5TCllaZTdmYU80RWNhVXFWWXZHTkNsTjlVb2Rzdm5ackF6YXRKZzFhR3RqTDA5ai9jMGlsN3BqOWFxdGFkdlRaMitaZS9MajljdjRRbWMKaStvY0lqT2FOTnFwc0cweGVRV1E1dGloQVRDbjRKOW5VeVdkb3BxWEorcG85UmhTbDllaHJVNnhleXBIZCtvMksvUzN0eVdVc29IUgp0SHM2UmUvcHo5YnIrZlAzdGs3ZnN6R2twWnFrZ1kwSEMrWFZub3JlTmZUWmxyT2xEZ0dDT2VnNVNGdW42SHNBRDFQaldFOTJHaHBNCmUxdU5ZdmYwUGExUjYwb0luN2NGQzFvZDdxaWY5U3AvTHE4enZJKzFjdnFHbjJVUmh0TkZLQktZK3RDU2dvdGU3YWtBUlVIZGh0MlUKbnRNbFdPS0poSEF3V0NxZDB0YlNHdU5ZVHg0Z09pQkQyMm9VdTZlYmZScFZrMlMxcGhiR3Z3eDNWSUl2ZTNzd3J6VzhrYlp6K29xOQpJejlCZ0QvaFpxcStNUXJUUWhkZjdhbUFuQ1dOYjlaWWRCbldBbTgrbFhNSzRFNVJaVzFXQ0VhclZoMy8ycHJxRkx1bE8zK05LbnBWCm9KempUY0hNYWlLQTNkRW96MDNGdFNkcjlkclR0NlpPMy9JSG1aU3drTUJQTEtJL3NqS2FZOG1KaSs1UzhQSFVMWVVEbElpcU9oTTUKclgzV2R4SlpyOGo5V3AxVlhUaTlFU2ZZclZ3NVY2SXM1SVZPY0crbWFMaEV2MWNaSXJYYkF4VVBxdkJIdG5iT1hxeTdVcVBxd0JzQwpXdHlQMklqU1cvT3F6czhVNVRFMlROaWtEbFdxc1U1UXhycXBBdHRxQVk1UVZRUFFkaHJCN3FhWE9SR1RBeXlwdFlQMXMyM0QzWXpnCnJsZDlwbGJMbjlyYk9YMjNIMkw1Y1p1RnlBSjFnMTZqVjNzcTVMdlZRbVVpSEVGUVZPYW8wb1JtUm5PSzg3RTFwVFRXdzl0dmVXeXIKVWV5ZXpzZU1XaFRTUGJSVlRhem85Nnc5c2Nid2JLMWVlLzdXMXVsN2ZnNXg0cVF2WTFZak5PVnRHRWRmN2Fnd3RzQWpEQVZ0aWJPYQp6U2hmUnpldkdFRUZUcmpRbG0yb05hdTNiR2pJS1g1RHZiQlJJOS9rMEp1aUhTZlY0WTVPMFN2OXdYcTk5a3F0cmRPWC9DRmtYRERPCjFSTEdCTWVJZEdJMFVBT2N0VVFMdG5nMm9GRFcxQW1xd3FVclpPa2ZxMkdOTWF0SGE2cFI3STZ1L0JrVnJoRmlIRnRiU0Y0YTZuQkwKSStpRjdjbGFOWC80MXRMSkszNytDVWtiekd6eDFMSkFISVBjcURBMlpaVzNwQTIxQjJyd0hqeVdXMW83UmQrSytYTzNzZDVNODhYUQpsQlBzam43ZDdCTnlKZ3JVR3hLS2FORExjRU9uZVAvcmcvVjY3ZUZiVzZjditYbTJWaUI3a29hK01pengxWTVZUFNuQmF1WkR4dm9zCmFzOUZzdjVPVWVGaThVeDhyWjVJV1VncU5MVFZLSFpMdDhNb1ZmcU11ZFI2VzNIV3dKOStUNmM4dDRmVlordjE3UEY3VXljdjZWMzMKMmNLNkhnL1grbHcrUTBBamsxbDhHNW9ad0s4RnE4N0J6UEtpY3dIT3g3SE1BR1Zsc0xvUnlsd1JlMUZ6UnpJWEdyaFNCeklYakViYQp3NWhsN29zUUVEdUtHZWtiS3h3TURtSmVrWU9CcU9ZQnc0eXdyUlhENHhCbUdFcm5VanVDR1U2SVV0SWV3QXl6OCt6SUp1YmpKVVF4CmRmaHlKZ0I5RDE2V204MGNhY2N1TXp3eXJoMjd2QUl3UU4yM1k1Y0xBVnhMaHk2WFRkWXRzY3lHWEthSVRPUGdBRnlHQ1hjcnk5cVIKeTRHUVF6cFV6WWxJcE15NmJYdnNNdEF5RWJab2h5NURGbHRTQnk2ZmpmYmU0bGhoZEFZYkdtSExuV2dXYk9SZDVDZzZHQmtoM2FtRQpQV2E1d0Erd2JwMVk1TmtxRkZadnB4TUc4SEFuR3NhNHQyTXc1SDYzQWEzY244bHJ0YWUyZHM3ZTdYSC95aWVoT2VJZXBReUNBNVFoCnpqZHdjczA3V0hKaHJFaHFxR1RoejhpQzB6REp6Q01UOTRoaytEK0M1ZGtqSUJtaWN3Y1pZMmFqaVJHS0xPdDNnOTI3RVJOU3hBMzQKWWdRZG5XQ1EwMGlaTy9CNDNpT081dzQxQmc2NFlzY3lwSEdFL25HQ000WUMzVEhHMFI3RGtjTkltclN1ZTN6eHdpeDFuWWFFNmRHdwpwUVFYTDliSUNDMDJkQU0vWiszVEJpa0daSUJaT3djM09lWmZ5VXZIRTFkN0VrY1RZeDdOS2V6QnhLWGF3allzTWZwbFJCSXozK3k2Cnh4RUxDOGtobEE0amhqRjRYVHVJdUJZYnYrSHhBZ1BiNGJweUNERm5uS09IZDlOdnY3YkJjaFp6ZmpYY2NDY2ExSmM1aG9BUmNqUXcKbVBFcFpoaHpjNmtEc1FBSEgwSnZwaE1HOEc0bkdzYTN0Mk13NEhhekFTemNuOGlJL1ptdG1iTTM4eGVIQlMzbnZBY0tkNkpqZTJtWgpIdEMvQU9LWEU0eXdDSnNsYkNORVdIYlJkV3lsRVhZQVlTYzZwdGZiYWJCZnU5a09IR3dQNUxUK3hOYksyWHY1Q3lkRy9BNGczVmNqCjBiRzhXRnRrR3c3M1RjamFXOVk5S2hoV3IxQ0hTdGloNktiMFpwd3dJblE3MFlDODNvd2hmZHV0Qmpod2V4NnYwOTdDMnpoOUxYOWYKNUdJSzg3YUhBbmVpb1hmUmoyR0UvV2JHSGc2SVgyN3h3UHBUWC9SYWNFMVNxL1IyR21FQTVIYWk0WFo3T3didDdYY2JFTUQ5bWJ4VwplMnB2NS9UZC9LVmg1c25NOXptZ2Z4dlJFYnV5T0xiRVBEWUc2b1hwcWRCelBXQi9oWmt0c1F4RXVEZDVpbmhyeHdrakVMY1REYS9iCjJqRkViN3ZaZ1BwdFQrUjEybnQ0STZjdmRza1pCcWQzWk9ENUNCZnNWQWY1SWE0MExCNGFEQ0NnN0w0NHIydVBGNFRmT1pUWWlSWHAKbGJjQmQ5Z0lJM1N2RVIzaDE5cHhFR0M3MjRnVTdBL2wxUDdnM3RMNUMzNTJyZUtqazBVODhnVEw0V2UvZVAzdXdpRWorUFhzZHk4Zgo5RUYrK2ViNVYvL3o0Yy9hZHA0UFAvdjF3N05MUjVQY3ZuajExWmNQYjU4L3ZINDMxSC9zSGwrK2ZmamppNGMvZmZYck4zLzYxbDR2Cndac2t1dTFqTitDWkovLzk0Y1h2Ly9EdTBRN3hxbSsrK1VvNjh2N3RtOWZmVy9lWEQvLys3c21WOFpMU0t5OGV2djJBZDd4NTg5TGYKVWNPNzF2ZS80Nys4K1ByZEh5Nk81WjJla1hQMyttdTc3dUtaT2YvanhSOGZmanJwTCtwWHE4N1BsVEhmVURLMnFxanBXRU9hTHA2WApvd2pwRHpzMngyN2xEVGVNMHU1MlBQZW1VZHRqL2JKZmY0bTJ1L292Y1dvT1RjbXlJOHc0ZGpndU9HVUtta1VOY2RZemlhT2ZTYnpzCmtxbGt6ZFdMVklDTFp3RUhFZUlsc25jamxTVUlBUUVKY0tHck9nNEwvMXlWNEJpa2hmaHMwR0tsSlhXMnRpdHlWS2s5Q2tkYmdkZEIKcGJtWjFNQWVxZHdGUUJJWHVoY1RzamdWWkdHQVVpL2Jjb0g1SElMdzRyWXFwTUFBbEF6RXpZNUFJQ1JMQ01haGhZQWRUd2hFQ3JYTApBSHhFcHJHY0ZiMVVlQUJLTW0wUFFnQ1F5U1NrMk41TTA3d25XSzREUmFRUTRERkJSbFB1blRRZndpa2dleXBmVFBiakxVY2lsVGErClBXQ1kwSjQycGtaTlNtREdOeWhmaXdNZ1IrcXlCcjB3TFp0U01zY2pCOHVSTmRQZzFxL01sWHRTbE02aER1ckNPK3BsQzhqU2pOSm8KZlZsdDVKQWZIRkVIT1BNcGE1Z3dqVjNJTmJGcURpOHEvOGh4c2phaEUvRVFWQVNRMVduVkJLR3NGdVlrMG1wV1ZQVUt4QzhzQ3lVNQprSDlkN2ZRSmhycXV3YXlyVEdFd3cvR21ZZGg2bGdid0RzSFRicTRPZ0E2dW5hL29DcWJXZzN1bExrWlpsQUl2Uzd0eW9TMDA0RkN4CnhZelB6QlNNL0ZrODFCNzNaR1FXS05HTkhaQ1VWdGVKbzQwMkE5QkpLQ3JMemV5S3dQTVhITThUVEVhUVd5NDBCcFZWVlM1MHh4S3AKeUsyVy8ydzJXeGpuRGhDTUplbjRwbG8xbzF4ZE1LUXp6RVVLSzAzSmp2TGdZS3N4RWI2NVJlT25Tb1FVeE1Tc20wbzdoY3V5MnRJaApaZldIQlZUT3JzdXNvMWthMFhyT0NtNWxQQVVvbEVuMEtoaUNZRUxDaUZkRE9Hb3l3aG51T0xpenEybTBHeXpwVXZmR0wxeEVLOTJZCktGNFJlbWxHbnBJTmpuVUZqeEUxaUNqL1pmV0FOc2o5U0hFQ3d4YVJkck9HMUFCd1hLTTZKWm44aExoQ2d4V1F5T1M1Z0JSR2JSdlQKa29BNGpkaWJvZUx4OCtJdWF2aUFnV09Vc1Nyb1NuajRrSWR1WTlwVVRWT29pVHZ4aFkwZHN3MGtwQkNHUGNwRGxMQzRLck56V0xCSwpLcFZLc1Bja2lVaGJCUU5mWkVqUXFtSVpMRExNSXh5Z3BraUhnckNHSHM1RUhBS0lTTElubnd1ODUyaUd3RU1RbHFSWmZaMVRhSEJNCkptZE9jektJUGhLelZXWVZEblFKVjdQa2dRUG9teVZDRUtEK3pveFhxMW9IVm9scUFMUWxiVkN2UXpJWEMybEFrWlpaRnhrSU5HTEQKdkxJQmpENzdVVlpDV0wwN1pvVFV5N2NnSnJ0TWRJRmx1S3hxaGc1ditMbDF2bXpWdEFnSERDUkdkczB5VVdEZUsxa0JDclRzbDAyVgpQWDJ6b0hjcmlGaUpodXFFcmdCblJad1YwWmxnZlFNY2YvYjhqQ0RTbWdHZ0g4NGdtMjN2RW9Md1REWDVzQjBRaHF1WXZYS0ZsMVF0ClFGUkRVQ2RWaS9xck9HNEx1NDIvR0x6TWtYMnJRTmd0Z2FGdVBHbGkwZkJsT3VIaGNGa2RoRlJ3N2dOdUJUZ09RL0ZocXlzOENhdFoKaUFQU0M4SlEyeGdYaUZIbTRySnFYOU9PSFBWNE9OSFJpMEduTnhKd2NHWmo2d1ZyRVVUYVZ0ZFY4MG5pc2hLTXdMdXRnRXZIeGw4MwpwTENVM3l1Vk9SaXB6Wklyb29vNllXS0JwU3JUa0VZR2doRkdzdUNLclhkVHY2MXM5eHpZVEIvQ3V1cThLZ3c2eXJZckY1czE0WXBKCmgyREh0ZVdoVytZaTAzTUxIRUx1MHJyL2J6QVlaUjBpeS9QRzhFV01ZU0U4QjViN2xXTVdRdW9DRWF6dm9JR0Q4Zk9zSXkyclQwRlEKekdzaGhGUWNrdDJhUWk3MHF2anBLdXVObVVyMWtUZlIrZkFLb3RzdCtsN1Nvem8vbUNtNDBMcTNJR0VpWEhMWUVDRENWYVo4WHRlVwpBMTYyTFRoYVlSU2UxYVBCWEZFRjdHSFZKQzA3NlhCdjZxTUVBTVJUZ0tYYmo0OVlORFl2RW1uS25UMXVBQTBIWktQWHdHbHVHWkg1Cm9HT1RKVFFrV0hnbHVEWUpnTVVqYVJLRkpSQVlFeHZBbFQxVUFpbytUWExZREt0NktXWWVMb1VVNWJySmg1bmF1QktlbXpDZnNNQmEKTGFUY1o1TE5ESjViTlVFZ2pLNUpYanpZbHNVMWcyaXRUUmMzd2QwTWg4VldZNEg5QkxkRktFMk82Vjh0a3hBeXFabllNVmZHUHJYUApnY0Y3aTVxblhGclJTRkhJUlVWcmFXd3F6MmhSdVNjdWpHMFJucHNkZExocUFpZ0UvWWFzdWhORlJ6cXY0dkFaWndPRTNDUlZTRm9MCnBNdW81ajZjTTR2TS95SzRhbFRhd25QL3pLeWdqNWhvZ29hbExVZXpWaUVWS2dpMFdVQk13bGpncXRsVDB5UEFEU2RVTWRlTkdibDQKWHVFQ3pxblpGTWo4MHFMN29MNVhWYjh5WmpuTldSbHhYWW5aNFkyelJIV2VZaDNYMGlXM2pkdXNlbVR3RVNPQlBLRTBsNjRRZXlzMwpTM29yL0NJKzlycjVlMFFlZW9iUGVWVmNRMFpPTFJEbUpuc1huVkxJeDB1K2duRVNNUVpwK210U3ZxSkhCVmExVHQrWXhCN1FaNWxLCmtPSlhaMGhQMENMSnhCYUQ3Qyt5V2tTRHM4dG1qZFNqWXBBTVRJbUZpOUN3T0d0V1gxMzlRZTJnejkxZWdhZ0VFQXR0VDFWRGQwSEkKbVBZSlRrcnNscGl6S2JUTFpvQlRzZlhRYmdZQ1lPV0tWOWU0a0FCeHRjejZic3JHZ3ZYMnFqckVzbWlpWlRoVTY2cm52N0dMc1BpMgo1SHpNd1ByY0hDT2RRTVVlVWZSTnkxYVhjZnFnRVhndldjZ2JRazViTGNTWFluOGk5d0dEb0swUHZwbEJMT1FwUE1KSVpXaTRPTUFPCnNKMHYyYlk5NW9TS1BPMGl1V1FDWW9GUEdjU0VaR3VJZ2VlYVFseGtVQUpqN3hHSFZ1YlNMbU5LdkdXeGtRVUIxZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJSS9aTDBDUjNqRGNGb1hvd1FWQ1pLek4zY3FZQmxUb0ZHUVJkM0ZGUHZnRXZoaExHWGhUWkVaN0ZqRk9HWm0yNkFNbTlVTnRWbTU5TQpQdDNRRzF1TWxmY0NqVXNST1JXd1BFQ29ub2t5ckhtL2ZZT0ljUVlNZUU3WmFnVVNSSWpRM0d3SURNYm42cjJJL0FMZ1o1aTUwQ2d4CnJzd2dMWE9hOGtzbklDallkOVJHcktiK01TNEFtK1ZNK1JkQld5cUI2V2Vkd0NZcXRUcW1vbENKWnk0eUovRG9Fdy8vTWlMc0VWQkkKTkZ1cE5MMUFyV01DZVp1S0N5QldwUjlic2lFMWh4RFZheWdxWVZseFVDM0VIR0JMSVRhRHdhQS9NQmp1VVpkbkJFMGtaOVhxOUlqWgpZajZZdWRxeE9BVWRWOXBWaEFtZ3FaeFVYU051QW9NUnF4RVFOdzM1cmpFcjVHaUFNQXVuN0x3YXdoWkhDU1RxUlNvSmtETXdwV1N5CldSWEJ1bVprdmI2YWJWWWg3MnMwaVJ6TGlWeUlsaGUvRjlZWTVBRllYbGEzUkZma1NDNG1nczZXa0JLWGJRNjhuemROWEFoaXBHSzYKRWIrRjlPTWJkRzljQlFzTXdzLzZhZ25ndGppMDFLM2kwSldnVFNKbjM2cjRMazFzdG5ZNUhrTk5TRklzTHBjRmxRcHhIRTNRcEtYYwpiSG5hVURJdWpEZzNhS3pZYklzbHVTTjZPTklVcFI3eEJkQU9rVm0yWlppTkdrT0VPSExXNFZnQUNMMmdWM0VSeEdHaytVN05ONTRVClRFQXBLbW5lTHoweU9xaWV4MG5PZk9LQnpFeFo4T3laQ01BanpGdkc5TzhJbWl1YTlhYXN1clBQalhzNEVkbGc2NktJLzFVVHB0dVEKTVJ5VG92b1ZqcXR2REorVENLR0lxMlZaMWJ5TnhUZ2xDSHFBbEdwVmZobWxmYzJkWWZsZ0dlcGZiTVBGM3Nma1RnV1NrMGNZVURLRApxVUoySnd0ZzVBR1ZjR3U2U0w0aStBOWhqMUQ5Zk92VWVBK2tmY3FLdEZGZEI5YkNUZkc4ekE3dkJGZHRhTG5zdFRZMWRjR1dvaDViCkl5REdLM3RZWHlQQ0pKbzFsYURzTUh4SW5Xa25JblJ6S1NOeGt5YUJTenJsTkdlN0IzU0ZsVllnaEpQektFL0MweXBQbHkvS0FaajYKczZxeXhEQjdIa3dRZzJLZWtCRlk4NmtqNHBEWitiT2RneEJydC9HQnV1YWdySDlGZjRHU0dZUWR3YkVRaDRSOG1Nd2tBTXJzUnhvdQo4RSt1eS81S1pyelhPMVM5TXVwSlRnZ0x0QVhDTy9CSUw3cXE3Q3dCUm90aDkxdXh4d0J6VEhRcldBNzJBYjVscWhhbmk0U1ZtNTQ0ClFPY2k0S0FsSVdtOGNJdEZVMWxYYllsM0JGT2gyNXh2d0JnT2c4ZVFzZ1E5OTRDSEl1SEN6WlBKQU9hQ0JVNXE1b0VKWEZuUmtvTW0KUFJkbFcycngzYlBmVWZHbXEvSjNWRXVjR1h4V0tGQUlNVTEyZWhQdEszcGxVS2xKeFlYTUNMcUVjRnV5NDhRVEJUSmtSWVY5eHR6eQpmeVl6aTJJOVlESUNSOHk4M1VoM2ptNUdWbFVhYTVGUDE4MmZpTFBUb3luQTloZkdzbTRhNlFJS2hWdUF3dFh5ek9UcmF3OTVVWE1xCnFNdHFvVEUwcGVJdDhxYXdjMEtLUUtHVzdsZFM2Z00xYjhndmlyWjRZQkl6Q0ZXTjR1UE1URHlDd1pQdDRRQ2pXVE9KeHh3dDFRNE4KM3B4anErWUYwc0FCSlBpTTdmelh0cEt3c2RCSUNHc1dQS1VCRTV6V0hNQUtvU0dGVmYwZ3o4MHNwc2Jhc0JydUI1b1JKVU9leWFmUgp4bnhXbVBCcTdOY3RtclNYWmk5V1VuQU5USFl4V3Q1SENxSlpWNExiajNSNEdZU0hidVZwa3BzeUM0TFlFSi9IblFkTFlZVWdvR2F1Cll1dUJ4d3hpR1NDUkdLTVlFTEZjR1NNY2JNV2owZGt0OXJCd01tYUduY0lnTmlna1NUZG0zWkZ4RENWRHUyYUc1dmVVaXlLQmE3MUkKT1hjek9ZcGJlc2xHNFJTR2xMNzU3Z1UvQ1RHNGNGVkE5NGw2Z2JvekNINkFrVlFHZDZWem40NXh2aWZlUGxmMVE2UjUxaXMxSC9ScwpFZzRNYXJTM1NnL1E2dGFzYkJYbmJtNDAxOEV1eUx4WUc3UFJHcUVtaG8xdnZwWm5TejZEb0JreVpiUkNDekJCWjVadGN0Rmc4N1ZOCkd6Z0YwRkpXNlFHcG9MZ1NObU13V01iVU16azJhN1ozUXdwb0pueVpaelVQWVQ0anBuSGpPWWNhU0VwbVR5U1pzemo0UWhpbEg1SHgKSzJzVXVaMGVSZTJMQkdSVVFZUitzY3d6SkJKM2dGMk5TWnV3NUMzK2ZsMDBsY3MybDZLRTBCZFR6WHBvZEt5enZoeWNGWnM1NXhqWQpnRFd6QWF4aEJoWXMxWFhORFBkUksyeWNkUVV5RGFqMUNHWmhTU3FINkpMUHFxUUJGTWk4WG9oSUxmb1p6ampHMU1OMXdwaGpQNWdLCldXZXBNU1owdzhxRVo0VFpBVHFjRnczRnA0a0JhUmFhV1RyaTNFTkNVK2VDOTRMRUNJNVF6VlRDWUppWktkZ0p1dE1oc3h6cU1GOFcKTytXYSt4a01uQ25idG9RRnpIdTUwd0tpTHhRUUVHZWVqRlBVRmtCME16OFdlRHJ3ZlV6OUlnb1loYWNNYUtML1RXWWpDTzFlUE4rQgpXWWg4ejRXcEI2dWVWbVJNdmtVejZXd01EeEk1QS9ZaWZCS0oxMC9ScVhyTVljSkprSmxWbUU4RWVTQUNSRlVRa0xkemcwSElNOUNSCldQVm9NOWdoMlF6Q2pYQW9PUUdSdUJVaXZkVWg1RGZEdDVHckpSWm02ZHJVMUVaemZxSTh3M3hBVzlJS0t2WlVOWDhqeWV2TXpNeVIKbS9oV1RRb2lSSGlqMHltN21RVEVpc1RNSUdZNFI3SmxLTjQyOVJZUkMwQm5hSEY5bGpTNCsrRkI1VjZCcHBtdWVtYWMya2JLdXRveAp2OElJL2MyQ0JaWWhXVUtraFErdVVtRjNZRG96N2dmTk1XN21pRElIR2tTNnlMQmlSSEJ4azBIZVhjbzJ6TGNFRlFQb2NUOStkcXZ0CktKM0lYQlB3U2dwdnJLeEdHQU44cjdCQWtzQXdrVUFvUVd6WDJlbWRzeHBwMlJLVFo0S1hzV3R3UjBaSGc5THVDT3VGWmpPQmZvYVYKdmJqQVFIeDUxTnphVEpXMVZiVkNxa1NYZFlyakphbkI2Q0ZTTVpxbVd6V0ZsQjBTQUVPcU0yVjR0UFVvY0lUSll2WEFaSWpnT3owRgpCZ3VJWnMyc0NTbGxoZmZ6OGJLZSs0aHpXS3VlbmFWcHYxblBLRVhUelVXRWZiUUw5UnlVZ0FRb21GNmdLT2dxS1pEdFhLeHZBais0Cjl1SUtyMldnaUE3ZkFpQVJNUWNnTU1RZ204aUdjNC9odlZnUndPazhPNmg0QnNPYmN2WkF2Q01QbUxPTHVCMkJrTmJVcmlLMEY4UmcKMndnTXMyZ2FXamsvMDAyMWRsV0ZxUWZnUTRlUkppZjFDV3E0dzZLeUZSMXdVanZ4R0dNVFEyaC9wZWtuV01UaEJ1NjN3cDVnc29XNgpyWXhBY1FENVQ4eHJxcldRdlFGOXNVTEsxZUFqQnZjai9mcnN4a3NRMGExNVZyQXJuRUdZaW5sV095M2NJMjVnODlQc1M5U3RFYUgrCk5PaVZxT1l6cTBTM0dseE5hTFRCQkpDSkRkb0hnSm0wK0RMN3JOcW9hWFpDVkN6MkN2dXNNbzZkZU9kMW1PY0dNTTFnRVMxT2dGcm4KUGRGb21QQ1dVSUI3c09nUUZGUGdyS2NPNndUdHdFUTdkcThFWVVmZUlnRmNEeE9URTNCMFc5NWFyeXNOTzNyUndDa0NTUUgyaVlxcwpwLzF4MlpxSEV6U3VidEN5T2NxWjBCUnVNNGJLZ0lBdXhqay84M0RaU2xWOE01c1Aya0ZjTmpZakluZVJ2MkhUeTdxaHVTN3FoUWVSCmJqYmtDZ3c4djdxc2tBMEw3Qmx3Y0ppcmdvWUFnSklnSVM5dUNnR2hiZ3pVS2ZRNEZRckF0TEtYNHNlcEZNcS9CejBpYzJVbDJveHoKTk1CeHNmTVFRU2d0Z2Q5bWJ0ZG8vc095cVdPTkcxTFFaeVFPQkpmTjN2bEZoWWtGY0I0SWdpMkR5YXFpSHQ2VVo5WnVDbjI1c1htNApZRElnQkZMdk5Xc3dRSXFLU0NOaFU0UDE3R0FIbU80aFZnTHZ0M3JVSVNBUnpEdFFOR2ROVXV0MDNQcEY5TXZDOGgxV0RTK2krNTFKCnZQU2pNR28yMm4xMnF5WVRTY21zUy9CSkUrbXp3UE5UdEU4NXl0QlQzZnNHNkF6U1E5RTl0Rm82R2pBcytvOFd2WnM4S1M3YjZPL3gKUjZSZ0E4OW1XdFc1UE5QS0xmMnRjQ0VMa3NRRWIyZHhnd2cyZ2ZTSmpBb0FBYUtvaHNJc1l6dVp5cUhlemR5WWNQSGxUYk4yMGVzego5K1UvR3dCbVZpdEh2dEtWeDM3RDZXK0VhU0VuTURkcEkraTZCNTlrRWtlcnRSWFZ3WkRES2xkTm9FbVZTWGFaa2p5b2tVSTNUS2ZxCkdlTm54TWtqdjFvRkQ5elV4OEF0MXAzUVc5S3NJTEJPWmp1NmsyWitaREtqcTJxemc5WVQ1WDduWnpBMzg2MW1ndmRVOHcwOGtKdUcKNUVhQXM2WDBJenVVdGhsUWtEcFE1Und1SmVpT1VQUkFTZ1dBNno2Q2ljMHNpNHI0aHBiSGhSNGRmb0dVdlp2R1E5RGE1OG9KMVF3egprT0d6bmtRQ1FZS1cyRVY5bExocWJrbEtrUU5uMDZZb3NEQXpHNjhpdStmbnhPUndNbnRyVDIzS1BRQkdGRFVxV040eDV2VW94VUJGCkdXZjZJWjR2dHplclNMR0pFS2pWY3FwU2g0SG1VSG5HQzRGbTdLRE5UNXhnSmhYVVRyb0I4cEFxb0tXaTZVdUVJa0UxNUJIcUxvSEMKOXFnbitITFdzQlk1SWV3akJDeEZneHZDWlQwbnZ4dmkxakxqTThpY296bWRSR2FqL2ZCTW9ybVpIazJ0TFdNYXFpWkt3RkhwczhhVAp0ampTTmNMSndUT2xrRFBCUXRGbE05N25TQ2dha2djWDMyeEhncE5JcitOcUdDWGE4UUpycmVDOHRNL1Y5dEcxUENKMEFJTmNGOHQ4CnpLWVRBNGMwYThKR1R5RVd1cW12UWRWK2VHY1g1cXd5SFJQUldKVFFreDI1dFl5R1Vod3FzNUMyQXFqQnBFdXpFc3lBYU9rSGw5RisKdUtpVkJpbUI0ZDlrMC9EWmd4QldKWkEza0ZDN0RaQmdNTFJOTUZiUTdIVTB6VUs4aHBjSmJoK1lwOXQ3bWN3Sk9TRkZtM3FLalNESQpBRE9CZkFsNnJyUENrWWo5Z3A5aGVPZnhZOFh5SlBESTVFMFhsRisxQXRVVHpTb1RtZTBOWjdwdUNvUWdBYndDUnNoNWRURjBNOXhECjBPVkExQnNNamN4RVVUVGRGblVvV1hmQjhRR3doOUUyU0tzbHN3QXVXZ3ZaekxkcVdTaVlNSFV3aUFLL1JkZExNcUVjK3RhcURodGQKQ0xObWN5SjJaZW5tSG1ZbjRacGNOTHRYMVJNN2RlR3pCdmhRNUVSZisyV0V6OHdHaXd4bVZFWDNMWXZkRFh3WWhPUWFGeTJDUERwRwp6WDlNdU16emUwSFE3QjF4b2ZCOTFYWUtzSjJDUXl2QkpyRHhRdEtrS29xd1NhSk9ZR1RpUTIvcXpPUldodWhpV00wd0pMQlRBUVBLCnpJTVJjRXZJSjBoblNWQlE2c1kyRU1uazBJOUVCZ0Y4dUhLR3lZNjhhZ2o5eWxSdnlPYmJRL1RwZjRocW1XQ1lQVStjVFlvSUpTRXgKcmJaMnRGOUZOekVHRml1YWFUY1pseG9Ndm9JRFkyQW5nU2RzZFZrS2x3VXlhd1VJSTgwbkRJdUlOaU40cDVobEQrdHh6aDExTjhOTQp4VVc2YXBZRldnMnh0TG1kTVN0Q1prUWNoWmwyR2JZemdLNW1WVlVJU2t6R1pFQ2dGNUlFOTB6aEZIakloUERZRWhCUVljZVR3Uk8rCkpsdUdKVU1HeW1IV2RjWVg0em5TOEYxbU5RTEJMMWF4Z3VEdGhyY2RmakVDeW9CVkMzNVVLb2haRVczcTBZUDNEQ1lwd2lJWHZZeG0KQ2RTQWdPeVhFUkVBWXJXazNCVG0xbVIrTVJBZzZSTTQ2VEpwUmhiQVRLNUxwQmloWS9BWE1TYzFVLzh0RGFIQVphN3ZWdFVwQXcyRgorb0NpNnhaRzNCUGdCSWdQdkMvQWUzZWNWcVRXc0FZREpPUHp4cytLZWxrdERuY05LcmZxUlVsZEpraEFIaFlGUFJGK1BGNG1mQ3BxCnV3M3l1REo0WDFURmpNZDJRVDlIUTNtVW9odHVKdGR5alNYb3ZmSmlBYjFBWmNKQUNLOGdnN2JYVE1WNnJicDhuOXRJYzVVQkVNeGcKLzlWMkpRQ0NpWFdEUUw0cVRxbzduUEdFVldHUnE5YWhWN0hCSkVFb0NsZk9jenZTYVRZVmZjWnkzNmpWVUVLam5ZMEtTOVUwRG5sVAoyNFFLamFwVHJXWmQxRlBqWU1OY0ZWeEpOQzRVUXpDSTFOd25XWkdyWUNQMG9PRVVKZHdkekFiVEJRUTZKRUJ3dSs4TVVLVThMMmcwCktNMW1aVWN6MVE1ald2MW1henRVYmxNUElUQmZ0TmE3alI5Mkp0ZURHVFlNRnp2ZVhUa2o1bVdnOXI0UjFLMnVESTQwYlZYY1REQ3IKOHRhZDFKRDJkTTY0M1h2Vy9HUU5JUnd0WG9OQnk5bWxscWl1eDlVUVp0anRaK0JUMXVyaUgxWlg1bHhZSGNjSElrTjVRT1ErRkZOTApCWUJRSVNVczJyRGJJSHBUT0hpQlFnQU1Ld2liNWltaUZqNEZvd21PdG9lblZVM2hhNXNoS2cvVGtWczVJU0xOVGdtcG9BTEJPWTNKClVXaURHd0pFTnA1cys4cW12WjhKZjI1WHV4QjI5Wk12bURGUFJ2Mm5oNS85NXQzYkY2OS9mL2pKOFhqOS9QbDNydz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJZnYzbTNUUFUzY1ZiMlVra2tCWUllb0JWRkZhTVYwYXRqTU1Jczh0UXhiTHVoRmxSZlJRUW1DNGFsbE1INzlCVVJyd0VxSFZSUVlJWQpWNDE1TVZ3K3BWVkd0NFFXenJBcXVnOVd4SVcyZHQ2VFVUQlFDVGN6OHFuUDBTZ3FUbmhpNGw1djArbk8zQitxTkxrakNzZVpGUmNDClZ5Z2U2b3dqMjZEYVJCYzVUbFlGcTFmRDQ2Ymh1bXVLcm00Rm5jdzhNSFpXVVl5cFRFZ0lSaUVPK2VUQ1dYZE5VSW1uSVNXdmFqVzIKSUltZ2dSdWcwQVRodXBxR00xVUZEK1BwS1h6Q0dZbFo1NThCTEFkRGNUbDNnYU8rRW8ra1dYNEpxWUZITE5zNEZzWjdsS3VtOHVyWgowSlZFNHZoQXdHRGpjN0JSWllRU3JscVczSzVLd0RreTlkNmlWeEVSQUoxK0NScmZRQTY3R1hwRzN3eWFYT0JKZzBYZkxLblJvN2pOCkdad0tIQmJiVllOeEVITTFjM0VTNk1wYTVEQlJ6WG9rSUpaanRmUWxUWXJFazRPb1V4dlltc0IyVmtyamlIeUVZUXMxZkhlanNzcTkKSVN2N0FpUU9DdVpxU1VIMHNFaDFaTkVaZStQYTYycEpYbmdjdEdYVDhCaHY5WWNHNXZsTFFLZjdWVXhVd3hRUm1MMVVjVFl5cG9WRwpBUUNqd0dIV2ViQjJKME1acjdPeFJvaDlNSUtnRmtlUi9vaUV6M1gydE1TZ3dWS0YvVzJlRnp1eE0zUDdoeVdOclVBU1hvTyttRjQxClcxOW4wMFdpaFNvV0lBTWhwRU9hWm1ZT1FJeXJPWGlBVjREd3lTMTRVNTZucHVwTndmaVJhRTdZRExlT3pzZXBHNGdQYVpXd3E2NkIKNlN6VWd3dUJCT2R6QU9UdmNremtzQXZEZ1pFOTgraU9XZ3FubWU2dHlCa1BPWmZ4WmY1aUFNbERuYTIrR2lHb2NWa1ZjMFh6UEpxTgpNZml4SFYrRlREbFlSVEJTY3c4RUFSQUJuSlNRWjIxSDB3aXRxZ2k0NTVBcDlwSDlpV1lLcE1TQTFGUm1sV3pnRXl4b0J5bldaN01SCndla21NaGJXaDd5NWVzbVdxbExDRE9nYXozRkJoRUJkMUJYTm15MUpaVWpLRWxpTndDWHprUllGbkpNQWl3ekVoSWF4V2VpcUpWSGgKUUt5MU1WRUJUZHBzZU5FMENUUXQ2R1ZaK1JyVGVLSzdnV1dEL1I2eVBGMDRUaERCa0NZWnZjeUp5WFQreFVJcmNEb0U0SStSR0d6RgpSYmY0RXNDa0tKUzFXbjcrZkNHNHRnNEVoSHU2U3VuRW10VmtIK2ttbUl1NjZ6SDdmVDdDSGJINXdiQUF3aU9lRmhZOFFyRFdXZk9pClFSUmtaQmQwQnh5NFNjM09XUSs4Y0VrSFFKY3huSENyaW1VMHI5R1ZWakxIcmNXUmNMYmpmSGEweFNxeUNEaldhOVMxUU13Z3hxeHgKSzZ6d2pUN2l4VmVWMm5CbjErY2hrbURoYmJScTM5aEFpd1FWV0FuR2pJelpGUFVpWFRGTVdhamU3NmJSZ01pejl1QVM1enNnTVhwbQpSS0ZLdW93bmluUnJ0N2pxU0tXb3Npa0Nxa2xBQWhxNHlNbTlHV0hFQ2t0Ykwram5va2V0WStMQlEwZlFsdXp6Q3Y4Q0VqMVZUWlRSCjlBVU1zd0lEWjZRaldUVVRNcVZQSE15UXNwNTB4VTBYUm1wSURNcXVOc1hjYk5WV05RQmQ2bzVHREF0Nk5qSGVWTStUYUZJUXJFb0kKQnlSVnA2TzZCK21maHA1REF1RjVjRkM3dnNiVzZxcjFvb0w3cW1xK3BQQVZrMFd5a05JQmREUnlNSW5acHNjTnAyQnlEUFlWUFpJdQpyN3FqTzRZak9kRElJQnJFblFDS3p1Zms0Q1ZHRFN2ODBJSGRQS2lJMHltbzQ0UUU5YjliaEF1dkk5QW5MRDNtbkZRT0QrelZ5NnlaCjdEY2U2QUNLOXVpc0hJK1Via1FyYW9RUGxCWTJUV1ZLVHNIOEs2b0tSUFhJV1F4RWJydXBScHJEeXNaM0FxYU51RHVBQXkwcFBUTWoKTzZHWnhHZ2M5MXF6UVJZQ0FYbkxTSUZlc05VZTFtalUxZUpWTWUwQVR3bDZXSUxLdG51NSszUEs5Z1RhODBDWnFwTlprNmtGRGZXQwpqTXM0ZHFDTUNUSkk1ZzNER1M4RXppMmFhWW5xbnNaaVlZMXB2QWlQaDZGMkE5Mnk2a25yM1BxVjBmdlpGYXNleUtLeGhKckdrSjZ1Cm1ldUdXUTJoZjJuK2c5UXUybGE2ZXZ5aW9zbi92R2tsekhUaE5FbVE5Nkx6STNxbXhhQ3dMOEFlNlE5ajRDQW5qZHJQK0dhQW0xY2UKT3FOdWMvZ2hwTW1LQ1UrRXB3Rytrcmw1ZUM4R3oyMTh4Sll4a2VkSEppN3NhSGtsNExnbTB0c0RMN0s1bzhMTUdEYW1qcU1yS3FxNwpHNFNBN2tnOWFCTDNTbkR6SlpvS1VZY29wLzZFMVZLWHpXb0U0bFhZd25oRU5mUnBUWkdta2YwZVA0ZlFGM2o2Z2JOb0VTOHczK01rCmxzMWlDb0RPd01sQ1FLZlJUb1Z6WUdnMnBybkNyMW9zRlJkcy83TW12YXpBSzh5UWl2RmVPRmNjeG0rbVUyaEJiSXRCTElEbFYzOGQKOFBBdzdzSWgyK0lWT0lteFFIcHdQcWpvU2JoQWFmZml3ZVdhRjJUbFpnZEtRUmcrOG5ndUxRUU9salBJNEYvTVYzcHVBUzN1UG84UQpSQ2kzRmNHTEFwT241ZllWZ2xES3RaaVJqY2NzV1pDYWhxVERSdGloMTNva0djOEVObE1Zb3ZXWXNpSXIrb2FFaGNjTnEvSFVMeXRRCmFLRHB1Uk9abHVxd2VpNkhhcGtuTEtWb000WnhPSXZucDRqcU1RUjhudmxBc3UxUmhlZ0d0U2N1bk9zeFdrNUxxRnF3aFFFTHFPYnUKMlk1aGpZUGRyUUp3eVVOVHpUY09WSUllbGFyUVp4S2dMc2N4WWdBZS9aWEhBeUcyU0kvOFlob1JNT3hpWjN0eGprYW1wZWdISkcvMAowRzBlSG1vcFBia3QyM0ZMeUNyaS9Qakd4b3dSTEF6aENob2hTV1JKTXNNb3Zkd3crS2JZTlY3NjFBSGVCSkZCUnZTOEp6cFg2RlpVCllNQkt3emxOQ00wNldJVUpwcWpCaFMzT083bGR0bGpLQnh4cDBHZElVR050V2kzWFY0dk5UYW90YVl3a3BEQ3pwdlBkbGszUmRqeG0KZ2FHd0NMeExCTWtraTZnbHM4WmhnL1BjczRRd3BDdDU2RGxNeE5pK2s2bG1yQUhzSmhDVHBaMzNaeG1yMDZaNFl6Yk9sSEtiNWU5QQovSzRzdUxScERvaG0zNGFFbExBRlIzMHp5a0xKWEg4TUJhL3FBaUNhU2tjdHFzZVlpejdZSWR0WWFkbGkyZ0VneE5URGtxeXpNNE5WCk5UamtqV1hBeXJJcUxDUWpoUWVHWXpHdkRXcmtHdHRsQkd1RHFORTVGbFdmMVVYR3p6QkE1S0lHQ0wwS1JneGhUSm53WVEzK1ZKQ0YKNTZGWkxDOERRbEFoaXV1WVlXWEJDYUV4S2F5RXZZbEdWdXhOYWRIbG1zdGdnNGViaFdrM2k2cThJTkJRQUFMRG5rQ0F1d1VFTjRXQgpTRUVEYlRFYUdDSElzSHVDNEhkVDdGaFJDT0Z6MndtcExpNUluVkUxU2JuT3E4cmNJZ1FjZ2w4bHk3bkFxd0x6a1NzeEdWSWYxamxtCkc5cXFmUTZNblN2TmF3VWlJaFU4b0k0RVFyYUtoNFBDMVErSFZORVZySmNWVFJDQVkrMnE1ZDZtWVk1WldSbkl1ZXFaS3d3VG5vM1AKUWNUVm1MZk1OSmR4dHMwNWVWenJxdkJyQUluY2trTEJEUlp0T0ZZM2srU1NmbGF2RlQ1elVnZDF2ZmxWUEVNQ2dYcmNITkJNcGY5MgowVTlFSXlVTGlsUFJKU2lhQ0lwRlpBeFBOZ1JRdEN4QzBjS3QzQmZtUWhuVHBqQkVwMnFjVE1vODlWcGRuMFRIenJRbURqc01zQ1E0Cnd5SzZQMmkyQS9nWWx4Y3RpTUk4dW5rZXdoMXBGV1dnbGFzMW1OUHcrMVlMV1NLU0tKb2R3OStOOHBOSVlSdDBEb3BsZElRdjVxVmgKYUhaUzNnZ0Frb3BscTA3czZObU0wV0hnc1J4TGlubFp3MW9vMExmREFqYzlhaHRTTGIxL09MR1pSNlFWZW9jMVZ4Q3owUTdDRWd5ZApWVkU2QkJ4VGRNYk90aWx1aHArWjc2anF1dk9yRnJxQUZVWFB6endCemxNL25RcmduMVc2QngvR0lvZnFuS0tmUWltekN4T0pKMkN1CjZzWGtIbHV5SjdLYURZQ2FOVXVCTXZsWjVUWFk4UmloRERNZ0pPVjEwWEJvcG5MQS9zVjBVS1duckdJWUY0aVc3NEdHWHJTZG5VRGYKV3U3cURkcW1teDhlNTNtMkF3L2dMV0F1ZUNJR2c2WnhBa1RmTVNqME5xNmFGbzN2eStNR3dURmhUNG5aY3VtcXM0MmYxUUUzTjErdgpWdHFLZFlnR2srclJMN2g1VUF1ZHUrMVV4QTYybzZBV0pqRXNkRkFHQVpCSEZCZk9FbTVTQUVEMGxnRlVzNi9EKzBlRG5OVWlBUndGCnpUaWdBWjQwS2lERjlFU2U4d2VyUkxIVUtjemJpeTJtakxsVVNsV0JwdFhDOVhDU0VaaUhTZXlFdW95WEdaRjUwNkVQVk4yK2dZZGcKNHZOcTV3TTVRV1czcXRieFZtdWIxVHlNb0J0R1NEZkMzR0ZialZnOWl5OE1vd0Q4MUdUeVZiVk1HalVPSHRxYWxFTlVwcU93dE1SYQphU21ySGxUQWNPMjZFMHVUeHRIVmFNSDUxU0JCZ0NDU3JlRm1SUzlyTm13OEVyTVhnQWhJSE1PL0VFbk1rNVpYd3djQ3hGM05EY0xwCmlDUkZLMDEwbWs5bVM1cVNOVjJwYXNjUXBVcERZNE84a0lqRmh5R2lvQXdDWE5nNEFwVU1HeW4xNEJsaW5udGZubHN5ci9GR1l4OVIKamZBSTRqTnpGbTVKc1N0b3BxVlZNakVFUGg4bVRFVzJzVVJ2VmJaZGI3UDFTdHVKSS9Rd0gydFdJNUpIaWpIcUNKTzNNR0ZVVUdOVQpOU2VYM2k2bzFhWGFoczdMQU9tQUNSMTZLd2dVQWFzRlVmdGw5QzJEQ0E4c0E4cG05blZtWEdMVUdCSm1kc3ZkU1JoaDUwSW1MNDB2ClhEU1BCM1pYWmxSZ3gvSTR2RmhVbGRWWHN4UmlvS3FDczdseUJRb01qUm9ZaDBRc01GVTRPRm9mcTI1bXdLanFKbWNlQVZJcW55SXEKREpaV2phMjV3Nkx1eVNGcUh2VkV6VkVEVXV2WVRGRTNzWTY0TzFBQlFiVGM2ZlFyY1JzMElKSzZZbzJnN3hmY0JMSnE0QUFXSVBnNQp3SEFVWWJET21DSFBLY29VaWlWbWJQWGdRb0ZLUjlHSitLQ3FhaGllc3dYY0VPeTlXREN4YXRCMDlDd2FKY3lNRTd6U0k0azd2cnIyCllHSlZJOERQNkV5RnlrWWhDTW5YR0dRYjY0QzRRYlJYc0hlazEwdlY2RTJQMEtINjNTbGhpQzNveEtnNTBvdW0rWUdEbFc5RTRITDIKQ0J4WU45aXA4R1VsbW8xTlZZRXUyUklQcWdpVExYNk5kczVTTzhySHdyMFh5eEFCdlVnVE9FS3kzelRUa3NvbnRJWDYwYzY1YUZCKwpDRXUvZzZXUnROUXJyTVB6NVlDcHlFMm5ORUFGckxtYUxtdmROTW9aa1ovY2xRbWpZdUtOZVFUWEI0WDdZL2xEaitPekJxdW1xZmVECkpqWmtoN1hEeDRMQ3BCaWFSZUVhYVU0V0U3V29wREV6Z1JvUHErTGg5RXBtZFYySC9rZDRTMUdQdDY3aWJFQksrdE5kd09ZWkJId3UKYzBVeWZSVlkzYlphMU1pcGJIVHpHUVd2Ly9KSUN1Y1BidWl2bjR6NkpOdnV4K1haUFQzUGJkWFR2OGVzdTFpcG9kU1dkRGZ5U0tyVQpjdTdDNEl0RHJzYVV1MmxUOTZLbjNNV2hvNWovbm5GMzVUa2k2NWh3RjdvMFpyRG4yNFZHS3ZkdDZYYWhRMVU5VXJCbDI0Mk1hVmxhCnNsMTh4cU42cmwxOFhqUkRiMHUxeTJ0Q2JwbDIwVzRwVzB1MEd4bXp2a3V6QzRTaXBmU2pReEYyVmxqUE5jbHVOdVRXa0dNWG1HbUsKd0paaUY0R1NNS2g0aHQzRkVGRzdCTHNqa2ZsMWwyVEpXejI5N3BMVWZMdkxycnNrUmZLMzVMckk1UDcvc2ZkdXU3NGt5WG5mRS9RNwo3QnNEdG9HaEtzK1psMUpiaG1XM1pFR3daQW1HUWRETmxrU0RQU05RbEFtL3ZkZDNpTXlzdFhvb0Nkd0NmS0VMY25yRnJxcC9IVE1qCkk3NzRCUmRSd2RhdHpuNi8wTHBNc3VVUlpOMXFoWS9CdXMzVDZNM1ZoYVJTN0ZkamRZTjF0cW02aU5qb2c3K2d1b2hhNURJT1U1ZTkKZWVZNlNGMG00MHQ1RTNXYmkwTTJVTGNWYWUwMlQ1ZUczdDQ0M1ZiTVdRaWFMbzZUNTJIcE5vdklYaWhkdE1RUnVVQWtYZWdmQzFONApCdWxpWlNhVXdzWFJaZnF6OUlQUlpjSFFPQkRkUGtQQ2RERjA0ZkVYQzVZNGQ0NGh6V2tRZERFSGkrQi9BWFE1VmZkNitMbXMzQXBVCk1UNnhxTzk2MFhPallzbjRYQlNKemNQTzVaOHV6TjNSZVhpM3ludWFuSXVPTUpwQkRjNGRsU0dpRzVzN0hLa0lhaTU2SFdDbURHZ3UKa3V3b3lMcVp1Y3VOTlFLWnV4SXpKUUhNeForY0JTNHdHblpaTldpNUsybCtNU3dYN2hOV0p6Y3JkM2JsSVFPVml5OFlxODRnNWVLOApxL2Jkb0Z5SXN4QlBDVTR1UzJMeHFRUW5sek1jSVc0M2NaalRYaDJiazh0Wno4UmJjbkl0SWlzdlRpNDFaUGpJemNtbGdpeEpDcW4xCkpBelVMODRiWHRXMU5nMU9MdTc3WTIzb293dzQ4OHNYSlhlNXkwNVFjdlVacXcwVksxQTRJeU80ZFdOeVpaeHIwdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJYkdHZ0dyeHZ1dGFqd2UzRzVQSmRvZHphbUZ4Nkt4UmtYYnN4OG5oamNwZnB6a0hKQmJzaDZaT2dDQlg2L2FZRjEyYmtycXhmQ2tTdQpGMEFCeUYzVCtxbUxqd3NiUHFiQTR5S3FnTnJ0b09QaU5GcTUyYmpJdUROV0lqUXVYdjFIQjZYdUZXSTVDbG9QR0hlaHFxMmx6Y1hsCnkxT0Rpb3U1RWl1K2k0a0xQcW5iK3pBODI1WWNyQ0RpdGtObjJ5TlFzKzR2ZUxoZ0Z1QkhBNGZicFBpN1liaE5ZYTlBNGFLK0Y3OFMKSkZ6OHpWKzVTSHBJVUVBc0hCemNIazJPbkl1QXMxREdEY0h0YnRRVEROenV4R0FnY0JIdnhpdHpFM0JaUzl0SEFIQ2hSL0pycjFrdApLWTEzNDIrclMzbUNmZ3ZPR2ZWOWh0K0tmMWRlN050cXZFaXdiNnVyVkFKOWk3K0Jjcm5KdC9zNEJ0OHl3UUhaczhDM3Rhb1kvdWJlCkZnK09nYjFGRkxxV0h0UmIrRkR0NlMvcUxWZEVxd1QwTm5jOTkyRGVmbmJOSWh3cEVUQW01MW5leUZzVVJTQTBaZUl0YUJGTmZGc0MKYjV1N0M5NjhXOElobnJseHQ4M2xTa0c3eFQ2Wkl0dFRPSXVWaHRwRGluV0wzK25zNUM2SWJjdGFGMXlnVzZJUkxocHVOUjAzTUxmSQpVeVB5ZEZGdVVXZGVSdDJRVzFSc00zNXN4bTEwRnJzUnR3QjQ0cFV5MGJhNVdldjVrMEs1bTI4TGhIRTVkTnVXbmIwMDNCWi9zNFQ1Cll0dFc1NWNEYmN2dkUwWGRJdHZ1UHkrd2JaMUt3Z1hZOW1PaHBNSlh3MXFhS3dodXJDMXkyNkI3QnRhMnVZWWdxTGJ3UW5IWGI2Z3QKM0poZU45SVdJd21URjBiYTRwK2JPTGliYUl0VElVL09RRnNreWxBQUhEemJWaG5MdTJtMk1QR0xNczRXZitPdUI4MFd3d2ZrSGpmTQpGZzRYNGFCbTJVS01oekJMc0d5QlZXbUNxdS9KQVRsSERySWkyVUtiaU1CRWdHeEp2eXoxeGJHbGt1SGpKZ1hHdGpvWUVCUmJnR2N4Ck9OOFFXeUFWTDRSdGRVNDVDTFlnVWZKRHZnQzJoZjFFOHViWEVqejU4WG9FdmhaL3AxVmU5TnE4eEc4TGVHMVc4Qy9RdFpuUThCZTQKdHJoMXNMbTFoZW1ydkxHMWhjclEvS0xXSW1XV1ZmVEVpbUpRbUhWZVV2MTB3TUxYQzFtTEZFUStGRnNvTXJpcUMyQXRKQVZFZXI2QQp0Ui92S3g2MWdiV1k0L1NFUE5XakdyKythYlVvTFdqandHcmgrai9qc0dvZnljOWZxRnFnMXNZNHBGcmNuSXRUKzNDWXV5bTFtSmhRCml4bVVXa2dlaTlvUnFpYU43ZWhmaUZxZ1pqRXZiRVF0MGhLaXlJcFF1NFFWZWdGcWtUbDd4Z2JVb2l6bTBHbXpaWGozbElvVVpoTDkKbElJQ2JsUHlRZE11ZFVCOW9XbVJOVVloVDVCcFVkSFcxZ0hUeHQ4M2x6WnNnYVZkV3N1Yk9BditKOWJZRjVRV0ZaVm9wQnhiMFBtdgpHMG03Lzc2SXRHRUxJQzNxZlhEVXphUDFhM2JqYUJmTHhldW0wYUo4SGk1S3dHZ2ZMb0VGeTlpYXhhMHJDaG90NUIyRVdRU045cUZXCnJMeHB0UGc2S1JJSkd1M3ZtRmJDV2pSd3RBOHJac1VDM2dNT3lqOTd1V2kwOEtyd2Q2RGF1ajd6bTBVTHNpRkFRa2JSZnJ3c0hBTTMKaXBZcXgvSW0wV0tXZnRJRzBRSm5NeEcvREJBdFJnaUdRRzRRTGJ1bnozbEF0QS9vejRqTUI0a1dxMklNakRlSVZoU3RkRGkwai9seApnYUZGa0tYTUY0VVdJV05FbFFKQ0M1bk0wMG93YURIdVBDTy9FTFNZVVRycVNrMmdCVlNBWlVOUk1JTlFVU2t2L214dUd2ck5uMlZsCnM0cVhtV25IMzFQYy9aMXF3bUZLR3hzK2k1eXlRRUxXYkRhRmRpNzBMUHl3cmlKY2NwdllkMm5XRFo2RnlCQkJtSnM3RzdiQXprSWEKTW1mYTFGbmVFS0kzams0Y0FpTzhLOEdjaFJRQVkyQWdaL0h2N0E1eEVXZGhtK3k5STBsTGNSMTM4R2FSWWMvdFJadEZucDFNV2NObQp5ekxjMUt4Wk1HeGR1YnlyK0twMUlVR2F4Y2pHUllRUnNxMG9WWDl6WnVHd0kxNFhOc1R2eUtBelpUYit2aUd6MjJiR0xKcnpQa3ppCjZqMzY3TEtHUTR1QXNLbGNGMkpXRFRGRzM0alpWRjFNdFJHemtDSUloM1VJczZrNGk3c0pzOWhLdUZHTGVmQzlNT0J4QTJacFRSY2wKRmdiaFJvTXZtMWdSMk1hYkx3dnBBMHV4cnoyN2FQNmJMMHZMek9YTmw4WHhLRi9jZkZuQlFsYzVmRmxwWWNvbndDemg0c1VKREdhNApTM1plSWdDelJLZU9OTitBV1ZxRkhEVmdGdi9Cbk9ZR3pQSS9tRjY2Q2JNQ3k1WjVDTE84T2tSbk5tR1cvNVNNNU4wUXF6eGRQUmVFCldXYWYrR0lFWVphUGhwQzBtekNMQkpGU1VTYk00ajQ5ZFpaRG1OV1RaK0xySXN3eUw4WklZUkJteVRaRlZYa2daZ21pWitqeVJzemkKQjFEMnNnbXpPQi9seDRJd3kwTXkvSG9UWmlsc1lwUXhDTFBFNFdmM0xaYk1NcHY0OVNMTVNoTFZEMkNXQm5ZT0NjQXNMT0lTM1lSWgp3bG1adnd6Q0xHS1ZpdnNHWVphQlAyVVlMOElzTTJQNmtFeVlaWXhuK1Q2eGVtMDFRWFplZ0Zrd0Y2UkJGbDhXREVRQ3N3TXZpMFpWCmFwVjI0V1ZYaStwUzgyVzUxVGgwV1J4bU9lMjU0YklJMmZEQkJsdVdnU2tWVlpndGkrdWdFdW5GbGwzTFgwS2daVmNTejIrVFpaRWMKU1BYTmxVV2NVTzNEakpXZFJiaXhUWldGQWV2TkYxUjI1bWlhWnFZc0RLSUNHaW1yN0VWNUUyVlJvcTN5VVFObEdUNUQxbjREWlpuUApiMk84Z2JLODVQejBBNVRsbytOWEdFQlpjREFSbDd4NXNzdTFpTWJKSWxiRjRMOXBzdmk3OXBzbEN3dGxKVWJKNGdDUG9tc2t5UksyCitmRTkzU0RaeEt4N1Nwc2txemk1a3d3c0lNRHNKNHppUlpMbElFWVljNUJrZWRPclhoVnhHbkNqTUtyZktGa0cxSWNhR3hJbFN3T2kKYllHU3BjRUUybzJTVlE2bTVZMlNWWnBram8yU1ZmNWx6UmRLRnFkTWVWaWdaRmx1dy9yYWFQU0ljbE44SHpkTGxpME9vQ0VJbGl5RwpkbjVyWnNueW5yQlc3bUxKMG9qNHVWbXl6SXdqQWgwc1dSaVlSTGhac2pBR2daWXNXUm9RVndtV0xBMXNTM2F4WkNsNXBLYkdNRmwyCkJNSFhIekJaREI5VUhOdzBXY2tnODl3MFdXNkYyU3Rvc2lrN1ozSFRaR0ZrZWlGb3Nsc3NLWnBzSXJ4bnRCZE5Ga2I2RWtHVHBRRmgKdktESjBzRG1NQmRORnFNMktibUd5WXJvdjFMUVpObmFHd1BXelpPRmtXV3lBWlJOcElhV3VZR3lOTENLK3dMS3lvaGtoWUd5UEE0TApEZzJVaFlFczl4c295MDRJeUxZSFVGYkZFbmtGVUpaOVFQa09YMEJaMWNZQXpXcWdMTnJWY05JT29peVV6eFMyM2tSWnlxR05rU1pSCk5sV2pmVTJVNWQ5OHB5K2tMSTJRQ0FSU1ZxcnFyQXdST1Z6OE5XcVRicVNzWk5UNnJpblFZT09mcFZwQUVtVzNRdm9teXRLdGExbUQKbkFTZUlQSFRtUW1pTEVUMFQvb0VsSVV4c1JneWlMS3dlSXA2b2dkOFBYbkdqWlJOcDMyQmtiSThGbnRHQkZJV29uaXFMRjlJV1Z5agovS3hBeW5JK1ZvTFdoRGE0TitNVFVaWktKNWFYQlZFVys2bWdMWWl5dUJFaUc5eEVXVWpZVFhVM1VSWXZGaitLQU1xbTVvNlJMNkFzCnkyV29DQW1nTEx0d0tUVnJvQ3g5Y1FDU2JxQnNpb3ozQnNyS2NuQ3lYMTM0N2R4akxIMmtGTjg0V1VFUzhxYkpZbXlsTk5vMFdUMzQKbFY0NFdScmhpd1ZPRm9lbWdEbDRzakJ3VnJwNXNreVR6N0Z4c3Z3YnMxVHdaR1hvNjhXVHhZOGhqUnc0V1g0UEFralNqOExNWUJUWgpscXNodjRZU2xjREpNaStaK3ViRVloU2FiYjVnc2hqUG5GbWtyVWRyVGFGa093YVlaNzVJc3JBOVpyNU9iVUpNaVRpeVVPZk9GMFdXCm5lZytibHRBWkx0ckE3MEovc1NRY0NOa3UxdTZCa0VXMktoSFFXSEVpTkFxRnRQRHhZOGxqSFhWTUxIWGErdWJIaHQvWC9EWWJUSTcKZG5yT0RTb3NXS2tzMHJuSXNhTXBhcnkzS1FLRUJEZzIvcjY0c2R0a2JPekh1VlBuYUdyc2ZBU3R1cUN4UWNzTlp1eDhOTFFGTW5ZKwpiaGgxRVdPeGo4bXZqTTFNQzBpQ0Z6c2Z2Ym8zTG5hNEJVN1FZcGtiVTRpS3RGalFCTWpOdTJDeGhJaVd1Vm14QVJVTlZDd0MwQjhECndRMktoUW1mVW9CaThUZHlvY0dKSFNLMzNwVFlZYWxYUUdLSHU1Y0VJNVpCNnR4ZmlOaHVEeUVRc2ZqY0prdkU1Y0dONkJad0VXSUQKR3hXQVdEUzhRVFl6K0xBOUszbC80V0ZwS25uVFliRUxrWVNHd3dMNnd3em9nY09DaUZYR1JzTWltWW1Vczhpd2dHR3hIMWw5NWJkWQo3Qk5jV0NSbUtWY3hGblo0VFhoVFlkbk9sQldtZ3NKMnJYRUNDZHNOL2J1SnNEeVJ1bm13YkROOWFMQ2RZYS82Z3NHeXVBdHZvbG13CjNjVE9RTUh1UXh3UWJIZCtMeml3dzBtVFozL0Vvc0NDU29GUUJDQ3dHSlBTaFh5ZDBTYmpRc0JDeDhYVlNXeXp0RndLQUN4SlYwUzcKSHY0cmlSV29JVk1xQ1g5MjNpUFJYNmYxQ2pmOWRSbzBHL0JYcU4xWnZXVDJLMUMyS05PN3lLK0xvZDJ5d2E5WWJiTEJnd3VDNCs4TAorN3BOcHI2QzY5SkY5aHRXam5HZGNUTmZsNkV3Z1h6Rk9veWZheUJmaVRkb2FoYTFrYTh3U2xHc2lCVjFIUXdlalNoZDZacktMK0lyCmdVaEQ4VWI1RTVCYlVVdHE1Q3Uzb056MFFyNWlDdU9vSGNoWE9KUmw4MTVuMFJPL2NhOVlKcUhTUDJpdlBKdEhHNm5pRjM3Q05LSjEKMXczQVZjQ1ZCdTVWYm9JZ3VXclRsZHdwOXNhOTJsVW9HL2NLQTBlendMM1N3UExsQy9kS1A0c25idHdyOFFrWWVvTDMrc1hsK1BHSAovNks4VjRiUXdQQzVlYTgwSXNvWXZGZUYxVXJlZ0ZkR3kwaDN2NGl2RElwQWVCTEVWMkllZUhBUlgxZlZ1M0FEWDNIQlhKMEg4SFV2CkJBUDRpckFYKzN2ZXdGZTFQcFREUXVJckRUam51Z042WFk1QXZlTjVvbFFFOEZVUnRkNDI4SlUxZlNTMVg4QlhCcFllSjdNa0srb1MKa0FmeGxmRUxacXN2NU90MkRJMTg1ZnRub1lEcTR1bktJa04vSVY5dkkyUHV5Ukh3UUw0UzZkQ1VwdG5JVndyTklXSUo1R3NpYkRmbgpqWHcxdEtLOGtLOVVDRklQWU9Tcm1HQ3RiT1FySGlFWE9UZnlGZVVaV0VJRzhSVmxSVVFtcTVwMXVhbkd6WHVGSnNsUWFYck44RWt4CkNnVHVsYkdqcWk1L0cvZkthRWRYUTJQeEJ4NzM2UXpjS3cxTmxYbW45b1hHMmpmdWxjZEJoRE53ci95MVBGKzBWOGJvMkJ2WnRGY3UKQnl2ckwxalB4d2dUYVlNSDlvb3dqUHMwc3pvSXpDYXNFUVAxeXRLSlhGK2tWeFFORVJwcjBPdVk0cllGNTNXNFNPdkd2TUpXVkpGSQpWZnR3dldoQVhvZS9oaHZ5Q2wzYU10TVZRa2pSTW9Qd09yb2lPVGZnZFRSWDI1dnZPb2FLVUUxM1JZaUZyUElMN29wK0RSaFRBKzdhCmw3dGJtdTNhSFd1NzBhNWdEaUZvRkdUWHJnaGVjRjNKS0JydGhYVmw4eEJrcGtSMXhSSHdoZ1hVbGYyUXgzZ3hYYnVyTDZPTUZUMHMKc2lyWFdiT0dNOGQ2K3lhNnN2OXdMUnZveWtMcm5EZlBGYXdvT0hrM3poVXViOVk1TVZtR0xvRkZsMEdZYTNVVjRNMXl4ZHJSemV2cApZTmE1QWJBTStlTnZ1T0EzeUpVTnpVZmVIRmYyeXNsbFkxd0JJSVZ5NWFhNG92NlJMcmNocnExcG0yQzRRdG1DdGZHTmNJVU5ybndnClhLR0lhVUt2Y2pVSnhZeHBiYnQ2dkZVbEpBTGcycXJrc05jK3JDQzY4YTJvQjJmSnU1a1Y0WVFIdmhXMUpKZy9iM29yUUJQNG5ZQzMKdHJsNzBuTE1SeFVNeWJvWHV4VTJmRHFCYm0yZVhvTGNpdk1vSnNSRnJoWXljSVRhREc1RlFuRWNkUitJQUVYaTJZMXB3WlV1MXdvQQpYSXJGRGN2cHpXeWRiaVIvSTF1WFZ6ZUJiRjN1MHhQRVZtaDZpWGk3Z0swUWpMS0kwYnhXbHRDc3RYR3QwQ2NqQUhmUldpVmozcXpXCjVUQjJvRnJ4ZC94S2tGb1ptSWVySGFUV0NLRUhxQlYxUGVBZzNKeFcxT2h4N1dsTTZ6TEdMeWl0eS9IY0c5S0tuSURlakFnb3UySTcKeEtxaU9lWHhnclRTU0t5dzVWT0pHTTFjTjZTVjRXejRxamVrbFEydUVmb0xTQ3NtZHNNQnlXaE4wWjdnWXJTZUk1blJDZ01STk1GbwpwWG9mUVltYjBRb3ZKbDRJcGFuZ2dMTjN0aG10VHMydUY2T1ZuaGRiUDVqUnlnd2tacDFndEg1eDJDSlk5ZjBZcmNzdFcxNklWa1JkCktmUVBRaXVpcmxHOHdQVU1wdlJrWXV1V3N5eFN5Z3h0eFhBQmd3cEJUV2ZGYmt5ZzNIQldGaVhLcXlhYWRRVmZOUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaUtzS2wxMm9WcjIyOFAxWWNoaWJvV3ZUOU5xRWhmRW5yM09CV2VtR00xOGZZRll1ZHBoYURqQXJRM2l1NGR0NFZZYnhXQnRwTGl2UApDN1hTbTh0S0I1ZmtyYzg3OWlxZHZkb2NzeUptam04Ynkwb0xPN0hlV0ZidXdGb1lZMWw1MFpoTWpHWGRmOTlZVm9aeldhMXZMS3NxCmMyZmRXRmJtcjFoZGNHRlpHZnhtZzdnUnNyVkh5czdnc3RMenpRS3NucHBDZUU0NWJTd3JZdThzT2pLVmxmOWVoSURkVkZhZUVlNWMKVUZsVDlCRUlLaXZGK3hoRWJ5b3JqZnlvVFdXbGdVT0txYXdjekZBN2NGTlo2ZTNodklQS0NnT3JZNFBLQ2dQVjVqZVZsWXRLanYyaQpzbExac0JReTBxOWpkSmhLQ0cwcUt4ZVp1R3VCWmNWN0RkRitVRm1WV3l6MVJXVWxUd0pJZzZDeUtzR2QrcWF5SWpiUE1lV21zaExvCjBRUmQxVmdJeHQ0OFVGWkY5RFZlYlNvclZRd0lGQVdWbFlZaUNpc0NXTnlyS25Cekt0cWhpZUs5TnBXVlhMcWtZTjRRNGkzcEJ0MVUKVmdnZUVPb0xLQ3R6YmZNd1dhR0RZZERpWnJLQ3A4WDA5TjRLbmdPQkM0YXlJdTNCOStPR3NzTEk1cXlDc2dJR1JIY2dvS3hJenpCQwpkRU5aeVI3RGtqT2dyRERRWXdzb0t3MlFTdDlRVmdKNldNOXZLS3VJUFI5M002Q3MzSTIxTGhlVU5UVzdhUUZsUlYwcmx4VUJaVlh6CmJqQ0VENVNWYVN2V214akt5cE91OGdVSVpRVytqYUNBaThrS20zN0xUTlpFVWsydG04bEtBK0ltTjVNVlJtTEhnc25LclhqOVpyTHkKd0VtYytNMWtSZjVQbkFveldmRmtpYThLSnVzMjNFeldZelNURlFkblFDSm9xNG42NGp4ZlRGWmtUT2wwN2EyeUZqQ0JaTjEvWDBUVwpzQVdRTlJIU0JTbUNnYXo3WmJ5QnJNeDhvaTQ3Z0t3c0ZVWnlPb0NzVEdPWmdIKzZ1OE80NUo3cEMwWVNDNnVTQUxJeUdhVy9kNTBEClgvU3FtOTlVZ3Z5SUIwRkVBLzRWNjhlYngwcThWWk1QcWV4eENkWmJBRmtad3BrM2o1Vkl3Q2RMVWpQMGFhZ3FQbmlzL0ppY1BMNDYKVEZTNUJ1YXg0dStPQkY3d1dHR2dwM1B6V0dGa29ENTRyRFM0R1NsNXJEUThPazQ5MzBwV210UkVWbVpYS1hJS0lpdjBhaXlKZXhGWgo4Wmk3T2VzRVlyS0NmNmdmS0lHc2xHOFJHSElCV2FrVHlJS2c2NHZHK2xuWlhBTlo4ZGF4ODlPTHlBb3IrY0NieUVvTEhzbEdzdEpDClFkdU5aT1h4Mk9vOGtLeFV6TEVxTlpDc3NEQnVkU0ZaNldBeSsya2tLd2xXZytxaklJY2treUl2SnV1MmJTWXJKeVBxTW9QSnluczEKeXljb0s2eDZwUXhsaFlHTC9RMWw1U2JVek54UVZscjVoQUxLS3Z6WE1LWlZ1TTZzRWU4RlphV0k3akZycVd2bTdCb3FOcFNWakFLbAo4eThvS3dPMnJFOE9LQ3RySUtsVk0yNlZiejJ2KzRLeWN0R1NqbTFGTDdSQUFHN0RUV1E5Um9OMjBNSkMxQkR6V0wvNDJOL1ZqZis0CkUxV1lpWU5qVlZWNTJqUldlT3RjWVFXTUZaSGNYdDhzVmdTSldGNXJGR3VYdW5xVFdLZEsyRjhnMWcvYklERFZTRlhJSmhBc0RCQXIKVnMxbzBITnpXTEdPNi9jdUErckVEV0cxM3ZQRllFVXRJSW9FakdCRmV3MXhTRVJnUmJ5eXBmb0NzRUp5alFwNzgxY1Ira0xOYk5CTgpnWldGL09QR3I4STJpV1FWZlJWQnVtZHU5aXBVOVNpV3VkR3JVR2Vqd0NMUXEvaDdJY1J2OGlyK1JubnZUVjRsdlBialF3anlLclRuClVERHNVNFBJbHF1Umd4SmpNZ1J1c2JDclVGY1hmTzB1N1FLVmJ1RUdYZEJWS0crSWw5YUFXcGJHOTBDdWxzNlcyQmR2RlI1RXhuTEIKdUZYMlhudktwcTJDYWxlZitZYXRsaUk5d0dhdFFndmVpR1IxU1FRTUtDQjZrVlpoaEdRMFFLdUZoUHQ4T0tzRkViVlMzcGpWc3FRawpKV1VWbVZBeU5mMmlJTlhNRmdrWFk3V2FMUmVJVmNiQTF0aUVWU3pZdWE2OUFLdUlUcERuRXJHcXg5UUM0MVc3UlZZM1hSVTI2b3dNClY4VStTNWxKUlVvZjh3Y3V0R3F6eENuSXFzM3Q1d0tzMm1LcU9XQlZxRTRZU0RkWUZaSUl2S2ZHcXNJNUhPa0ZWVVVnbEFrdU0xV0gKRVRPQlZCMHM5SHNCVlpFQXo2S2xrcWM2alBZSm5DcDJBWUxncHFsQzZjTDhsMkdxbU0zQlh6WkxGVElzMWlsY0tGVmNIaWJwSUtuaQo4cGxCZFhnUzRVT0VXbStPS2dKdjBDMEdScFhaYXBFVG1hM3JLdFMvR2FyZFBQOUFxRWFKY0JCVXUrdi9iNEFxR3g2VXRmbXB1K2pUCitOVEMwdVQwb3FkV002OENuZ3JJSjlKalpxZTJzdkdSRzUxS2tFU3VtNXphM0ZZb3dLbk5Lc1dibXdwYkVRQ1ZxbHBTSlhyZTFOUlcKQkpxL3FhblZBdnVBcHNLTFl0YzBKODlRL2NTZWZoY3lsYUtEVVRZeEZhUU9mRGdHcHVJT1FFbDU4MUpoZTFiZnVGVGdGNmZFTjZTbApGcVkrMGd1V0dpaVZZS1VXbGwvblFLWGl6NHlydWtpcHVCdVBoRU1FcFJhOGVpS1pNTUZmV0psZlhwaFVWUDJ3N2t1RkZTVnIrZ2hJCkttcUt5SFc5R0ttc0FjaHRJMUpGdmxxYmtJbzhaUjh2UG1ydUtySU1QQ3IrQmpRazZLajQrNm5yQlVmTnlJTTg3YkJSUVJaU2grbkIKcHJDVkgvcE5SaVVnM1RhQVVTSGdRSTR2d0toNFdiTUFwNXVMMm9BMmVnNFdGWE1qbk1LZ29pSSs5SWlsdXFHb2l6WGo2VEJSS3lzdQpEeElWNDVaZW8wTkViY0xkYkNKcThwUnBJQ3BlaFpwZU9GUzhRWEEzZ29ZSzNTVFNGMEZEeGF6SXk3MWdxS0FrUVA4UUxGUUVFSldpCnhFU0RMSHNlbjBpb1VNKzBBMExGbWwwL1F2SUxXMitXL01hZ2ZyeFlnRTFzQ3FvRm94dUNDbDF2TFc4R0tzSVBwUjRFS3FhT2NnQ28KeUhDbS91YWZJdnE4NXNHZjRsVmwyd0RUVHo4bS9xcUt5QU0vTFhKZWduMmFQVE1IK3BSbHZYaUxMdklweEJWOWJPNHBGaEFrNFFYMgpGS1ZBVC9wRVBRVUF2bTdvS1JKbGoxd3FESjFjdWxBdGV6RlBKVlZnWTNaSlloRkRkS3RsS1VjZWxycktvZHpRVTBUVFJZczI5UlFHCm9lRU41L25pNTM1UEp4ckQ1dkQ2TktDblVBVkFjUlhNMDBBbkJmSVV1YXNwU3VrbW5tSWxEaGxrQUU5UjhneWhTUEJPU1J5bzY0VTcKeFNnRVg4RzAwMlpTWThCTzhmZVlMOVJwYzRZN1NLZklEaUx1SHFCVDBrTWc0NzA0cDYySk5oS0JZaUNTNEcwRXdCVEFEK2VuTnVWMApwcDBCcFEyTFpkNEJWUzBDVFlQVitJMDRoUTAzTWdpbnk1aDlBMDVCaHRTL2Jyd3BJdG1ZOVlKdWlpb1lCcmE4RFJKbnlDemRiTk01CjFkWXowS1lCOWd4bTZaaEtWOXhnVTRUWDRGK0VyVThKUVFOckduL2ZWTk93QmRSMGVIWU5YT25vV2tUZVRGTW9MSXZrVzdUTnBOQnEKRUUzMzN4ZlFOR3pCTXlXRGRkV05NeDFHS053MFUwaE1TVEl4ekJSQU13UjZBMlpLd0ZrZUw1YnBjQy9hUUprT2ExMENYSXBYdStUeApBcGtDQm1yOEtZVmUwelR2d0poQzZSYlV6cUNZSXI1V0ZDOWtMSUovbDBNeFpSd3h2UmltMDVDWlFKaE90OW9KZ3FrYjI5NzhVc1lzCld3MThLWE9jSWlkeHJsTU90Tjd3MHFEMkJMdDBUamVEQ1hUcDlNZjNJcGRPWmlPbDMzSlJFa3RjQWx5S3Y3UEN4WnRiU2x1YUcxc0sKMWl0RUMwRXRSWDBLZkxBYldycE94ekJXZGhFRk8xSXdTMW5sa1YvRVV1Q0JFQVVLWUNuZU9lbm16U3VOMXI4dlhPa01BR1BRU2xlcwpWZ0pXeXJLck50K3NVcE5vTjZrVTU3UDY0WlNpNklTVmVEZW1GR0ZCb3Fvejc1UEtFZ0pTdW85d0lVcG41QkJOS0oxT3NRU1BORDd0Cm0wOEsyYVBvcDhLVHpxUWJ0N0dqbzVwQWR0TkplNkJDdzRoTUMvR2JacE5TUFR6ckcwMDYzSlI2azBuSnhlamxnRW5IYytwUFE5bzcKbmxPQktyVGE0ODRlUVNYOU1LZ3U4NGFTZGtkN041TzBQMUU0NmJMYmJiaUlwTWNtSUdrM29HVURNVWRXZWMrTFIwckpTdjIyYWFRbwpLd21NRzUySzZ1cW5GNHUwcnFnTU5vcVUrdlFlSFpla0xJOFdUenRuaU94T0tvb0E2dGd6eUh1bWFsUW52bDhRMG1hOXdHYVFJcW5WCjJpYVFqcURnM2dCUzVBOGhJdy8rS0ZkRDNnaTFvU1FnbW9vV0tncVVBeFdEN2xoZVc3TlVUSnM5V3JONldyelFveFdMNndDWjRrYkQKb0pwb2swZXI1WHczZUJRTjczVFdUclpGcmlld281K2RreCsvbytQelg2bWpmeXQxbFAyWEtETEFTUG94eGtveVc1cTcwNUpxMTVQYgpNaTF0eDFjVUt3bkd5MmtJU1RDMFdYTzZ1enNodWs4Y2YycDFCYXl1RUwycmEwbW90VWh5ZVJqY2hxYldJOUs2Y3c3RDRJMzFYc1kvCnNhajBPYlFBZ1psQm84TnlDQlpxdk1TeWZvUUxVS3VxUlYrem5UMGZKR3lKQ2NmS2hDdEtrOHZUbUxJSTU3d2M1SXVyYkducVRDWlkKT3FRTVkvV1IrRTVqVklFT2lyd3UxT0xDSjlUeTBXMEZNZ3RiY1JjSUJ4NXErNnppelpiazZLQ1Q3V2x5ZjZ4WmdaelVYRUlKQyt2ZgptV2tsTkF1V2tzNmVoTWpSMnJwSXcrNWJnVFVwTGhnV3lqZ1JnWjRCNW0vdUtjMG1yMWoyc20zNzR0bGlQYzlBKzZOUmt3MWxJLy9lCnEvS3BiQTNIeW5rV01pVjEwUDJZaXh2YmhaUEppSDV5VWJ6RUh1T2RDMGpNSXl4cnFPSTNveXN4V2FQc3YwUGxPMUErc1ZCU201NXEKNjNCL0hTWmRZRUhva245WC9WMERza2pqVkVQdHhsWTUzYzIxWU9rdEd2NGdza3hMTDZjNXZBQnRrTkJTUzRWSHJqWk1qemlncVR1dgpyajBqSjhibFJkSjJEenRoUUJHYjJTRWJqZGZaamFvcjE0NlhvRTVEcGRCemdEQlVQaWFFcnRGMVFDZzFURC9FRjB5WGpPRVc4bkVyCndXQXhLRytzV2xRTlIwb1JqK1czT3YwcDBaTGliT0gxZVQ5a1B2QTNpMUo0ZkZiL3c0SUJIcFlVMkFCOHQ2eW14aFAzOGJzS3kvQlcKRkR3QlVOV25wTXpqa29wdzlRUDFORHNRNC9OU25XNm1wUzUyVkhaZktIdzJZM3F5aHBXQ0RWcEI5S05sOEJjNmtWVTB3S25PcktqWQpUUWNmbFVMRFNnaFRWaEcvRHNXd1gzN2M0MUtXcVBSZUx2Q0VWZG80RWsxTjExZUpPQzRJdXEwc1dZN2pGVS9Jb0hFODlZOUVySVF0CkJ6QXFaM1dsWm5OME1OMzNyYVVWekZGWSticnd2V0dPRGt2bXhaYmRybC9rTm8rakVHeUR6VzZPUTJFb2JpZTBQMzRoOFkxcmtqNm0KTWM4b3dnN09LSDVtM3djR0RPazdJRjZCcDFNNStBM0RWVUFMd09pZzZ5ekV1ckg3QW1vM3NLTTJtNGJBOGJIeU8xZ3FRTkV6V2RKdwpKUzU0a2p0U2t4Y0R6WVArbHRBTmY2ZTRPNCsxdG9tUVhlOG56RW5zNTZyNmZlU2YvVHdvZXVBM2hlZTdXMEhnUk9uM0xFdUQwMXpDCkxPa0NrMzhReTFzeW5BQ0hXQVF6c25URmJ4RllFSURuODV1UG4rUlhpUVp5S3o5Ky96anRRU2YySkwzZ090YkFnT09xV0xiWEpFb0kKVnVUOThKdHFQem1ZeVM2MHlNZWs1bXpGbnRuNERDaXgyR05zRllQNndheGxiNjVaQWl5WmxLelV1T1V1SEhqSmxLeGpzZDNRUUZjUQprTU00cithZ3JWOGpIcXhVUERaeXUvRzN6Z0h6Q2ZrbzNkSmZXa3BNMGFoZDVMcUdWaVRadXh1NzhVZ01FWEllaVY4c2dXM29XY215ClJKK1pYNFpieTdFbkMxWW1pQlFoVm9XM2xZaGlEajZqUzYzTzdpWHNGMENRYnRORC96alM0ay9xdlVQTUFQSVR6ZTNEYnhVNTZ1d0UKRVBYbncwTXhCRnNmbzZnZkwyWjcrUk5ZZWFCYWFEaU1DOHZIeUsvVEp6dUZmZDlXMThNa1FTSThrVFdUbnpuK0E0YkhiOEhIRGEyeQpKTDdzaGVITi9aTStISlE5dVBIVnhCMkFxNXZQbnFWaWliRXRYeVFFK1hwN2t1RWIxV0p3M2d6a1ErZ3Jza2RORlNMNTUzQXB1U3lCCmxYVXNzS1FzSi9OaitIQXowSmN6R2lGUVNYbnBWbVMxdENMRDcxY2JwUlNCZGVJbEl6QXhhMG1kcUdQdDdvS2QyRmYzOGxMVWh4ZFcKUWdwZ1lXMHNjQlYweG1DaDMxc0VkZk9lVFJoNnJaeVRlakdKRmZTeHRsNjl5STl3NXhOYjVGS0Jvekx6dFIxQ3FIeC9TelhkS3JvWgpraS9RUnJpT3pRMW9VWUgxdUxWRkk1bWNQYit5bTFSQmRRUkYyZWhSM2djVkpGOU02TXo0aEhxZ2FtNExrV0RhTStadzBocTdGR29mCkE1dXVxaWg4Z2ZOZmNyTVlxOFQ1TS8vMXN4M2RRc3dUeVBsdG1IREFxYWVaNDNsWnB0Qnc0U0lUVllHUGgxck5GZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJSFp1eFpxNXNwVmhVMVVIV3hneVZXSGRiRWpUaVh1eWloZi9BODRXRlZLL3Vya25jTWI0aDF0dXcvV0ZSTW9lV0lzUGlDOWRkK3FlTwpyZEVqcXdWMmkzMDBLT0lNTGo4Ri9sa3RUeGRIMHVHYzZoNmROS25YakdFQmYydENRc3FTelRxenlXV0RKSys2OTlQNWt4eis2UGg5Ckx2ZDhtZXJYU1lrcUxXMnZBWVpmT3haT1BSS29VUkNNampVMVY0MU42cW5kbldENjBhc0hpa2YxYmxVMUYyR3hPQnVwY0R4a3Q4MGwKcWVmVGg1MVZKREFmdDA1YkpEaHgzWlRWSldlaHowSmliaTFwTXVvdEpJTE12dUpMUnNkVVlpaVE3R1MzbnlPMURDb1RaTWhyQzlXbQpwVW1UMGZDa0pyL1R6VllaYU9HZUxESkdKSHQvSkRYRkkraGUyWkJ1eW04RDhWZXNRR3YyUGVzSVBBVUFwamkwdzVtNDlQaVFOVVl5CkJ3VjlGVlhNMjZMc1UxWHEvbXlIVlJWblFjQjA2cU1JbHQ2ZmZybXJGb045M08vbFR3bFJKRG9TVkZlU0cwVGRwK2dzOFRrajFjUkEKR1FBcUkzaHUxVEFXSnY5SUhFcTVCM2FsN0QybHZpTzBoUUhrYWRZMFhxUktQQXZZY0VzV092emEwOTRmbENqNWNRa29heS9BTzhpcwpIWEVkSkY0THJoWjVYeW5oS21yRFU1S09UMEtBVy84bzJNZ3laYm9IZTRoRldESjhobWF3SHFzRDZEUGszSUtLMXo3NURGUnFWSGtwCm81cTdwMGdqa2J2VGJaZndqVFRyb3JSajk2QklLY0RrODFZamVNclVlUTdiZ2dhZU1mUWM2L1NpRlZGWGptS0E4M1BhaGw1U0hxRXQKZXRIRFp6dmJlWFZGcHdsNTY4dENXWWwzREdOcm9oWVRpOGNmd0tmT0JlOStYVUVxZ1JPaEo0bGdQRTZXZlhTYk9EdWRrdGhzaU5GagpVajd2Vjl2bDd5eHMwejJMZU92eTN4UjFQY1JJVGxucXhzWGdzVlU5Sk5KZWhlTnBlclJVRmRCU3U1Mi9QZHFCOUVWbm14TDJxU29CCjl3VmJwb0VpZmxVTVRFbzFlcmdoRjA2cUc5UmsrckttdXBnVUxoMVlJc0VoREVUYkhXTEI5MGdmaEtGTkJsWWgrb1lRbUJiditlRVYKNlFkempjYXNXSnB3dUs2VVpJcWpCRkFMREE4bGNOaVJzU1d5UnZaM0JjZ1JoZkpKcEdrMk1lMTJyTkxqdVA2Z3l3dE1TeXc2S0NrZQpmai9zSWliN3FSRDBONDU5MlpNNkFrTWw2dHNRTnFha0dwMXZOUElqUU0zN0NrYm5sRitnR0RGSkJWdk1qcWlQUExLVzdJcm9FZUh0Cm0wa3V5KzdVbGtmb2dHRWQxVDRmVy9JV3Z6MTBBaC81TUlyYXdZSm5wdkg4OFRCRDRWT1ZBSnoxRFA0RUN1ZWowZTFIOUQzd2JDdXAKQlJTUkluYlFteitWNWp0V0l0VXpJc2dDZ2c3Zk1sZ2Z0MWNYdTRvNnlhVEhwU1VUOGZreHZ0WUlmN0p1R29NY0FXbGRGczNzTEpzZwpNZlRxOGNOWG5EY0dEenMxa2NONm9lb1lpd2l2SGZwangza0ZOQTdOeFpScUFacHRhSGgwbjU4cUxTbm11WjNzb0NWV1pidkptcmZiCnFaUEJzUE5sZ1pSdjlmQW50eFh4WVhvK3cwZ1hWQUx5WmZ6czVNY2FJS05PdXFJNkhzSTh2Sk5xa1lYTUUzdXhkd1hBY2hERU1xWUgKek50WjMrRGlOcHlpdVd5dnhybmxZaGxJeGdjMmliMW9lazAvdmdINUFMbk1IZDJFc1l1T2dmRUluUkdnT0N2a2xLaldFb2FLQkJBTgoxWmNQSzdYb3J4M0pRT1B4ay83T1ZLM0FiUWs5TFE3UDhuYktEeEZPd051OUdETEtVZ0hqSXVCOEkwekttWVNYQ0NqVzRHYndhSGxCCkpnaGxLcGJ3azhVdHgza0sxUnBKV0lWZzRBVWdwZ0ZHTHRzWUY0UHRZRUVyRlJwMmp5K29wL0NPOFhEb1ZseTYwcENaZmhmQ3FMQ2cKSm9BWDJhd1M0Uzh5WUY2YXBnVnN4KzVVT2xmOGI1WG1FQmZMd0pGMmRHa2JubmRMRkc3QzI2WHFjMEJOakFmZkFqR3dSSXptbmtSUgo4NUtTWHNlY3ExQUtrQXFpYzFCV0tsY1h1V08vZkxORUkxaEtSZkRKTEQ3QlIrNTBSajBFdys0WUk2dFQrckFxbGd3ckF0eXdLSTZNClBpc1FLTUhBakFBSGo1WDJqblFxYzNWREVCNEtDMGRZV0hqSW4wekxCc3V2TWpXcE9NV2FsTFptSkozQmZyNWtET1VPVlVqalRyTUIKV29UODlvYzBFTDVRbkE3Z2FDTERHWjBxVWl6RE1sWWc5b3ZEMUNpN2U1Z3VLQ0xsY1RNK3kwZmR6bUhvdWU3OUdHWnZpdVp4RzRiRgpRYUJRWUsxWWgwc21SV0RTbncyUUtPcFRvRGp4MGxpeEVFNWlGSnJ2SlI3eHNKd1BjZWNlMlFVQ1J0bHFHR0UwaEZSYlJwd0kzYTE0CnFvUWVSOStCSkJJampSQkZzdjB0c1VPd2NPS0dHSWowSXZqS0pWakswQU5CazVIcGU3UGRzUjB3V056cElQa0ZoaCsvRzBJUlJjSkcKNGxuTHJDeTI3VkNxcUxEeGVKY0tLTWRJek12RXhSTXNBdnhQemRwVGl1WEhEaEVicWo1WnFSM0dEM2UwY0E3RlRCbDlWSjlYcDRBNgovSEgxb3NXckNjOXVmOCt3RHNic3B3cGxlU3dGdkRGZ1JKUGFvUjF6dkR4cys3QVl2YVNQd2J0U0krZUVjWVl2Q0hsRmVFYVBWUjg1CkcyekdwQk5DV3JnSEJLNDgwSWJ4WVQwZThnRlZXVEhXb1lzZEk5K1BPYlE1dVZVUis4NFc3VWdTR2U5U01rT0tWbkxVY1dXTG1aUEgKc0xYSFJMYk1ibmhqMkpMUHA4VysyTHhMT1MzblYzUU9VMW1yWXNUTkE1R0UyenZoNVJKSEdpVmovQ1NReldJT2ZpNlA4Ymc5YkNSSwp2bkowNHNXSGx0ek5PV01TOUxjb0MyV1UvRjRyazBOUTBVVjdBSkMxdEU1MUVVT204cmRvTzdZZjRUYU1mS0I3NHc3RlEwQU90M2hGCmJ4VW9ZUmlhVzQ3bFlPanRqOFlETmliUW80U3NudTJ5bThCUm1WRHU0ZWd0SjdyaS9CVi9jU2R5aWpHcUNtRmpkQ3pSWWhZV3FBZGgKVVIzWExLZTZFMVo1SWxQcW1FeXR0cnRvNzU4a0NZUXRzM3ZNemhCc2N4VktPU0xlVC9oYlU0K2NpNGlNU0ZIbU5VSStxOTNRTFlkOQprNk1iSnZnZk5YdllhM2hMWVdtUHR1bWhrSmQxNnBheDB3RVBOYm9zSE9Qd2U2M29GOWY1eFNyQkp4SlRLK0c5UmNpSEl4UUtDZVVmCmRIVld4TGx6RzdsS1U1Ri9waFRnem1RU0NKMEVvdTlFTnNqU2dKSWlrZ1ByTEYzakRRdW1ZRm5QZEhLUGVUVnNzNW9ubDNoekNJU0IKLzRFRkYyY2FOc2h5VnJCandRWkw3MDVQVTZtc1BhMnZoSlZkVzNCTkpIbHh4S3FrbUdVVjR5dHA1N3dqSEVLaG5xQ201aVNGT0FsOQpJNHdreUdaa1JIN2EwR1RROCs0ZkJrMmlqV3JNeXZTK3BscjJ4WUNoTVUrN2JnMCtlcElOcGFRWmdlYVJHcWVwUjRzNC9tS21LMEk0CmdYK3hHZnlBbkNHckUra1NLczN2WmltWkRhbTZoMWVFVXVVVEdzeUNTWUVMSTdvc0hLblo1NGJ1TWpsYStNVU5mczRoNDhYQVZCQUwKd1Z1MkhuaEx1U2pmblJtWXhidU04aHZYdE1EWUpoNFRmRlZVUFdRR1psSFh3ODFzR1J3R0VBc3FWb2RsYWlpeXRtdDh5MGhnbXJKOApMQi8xays5VndWNHZZTEN2ZTJuOThTcHp2WUFxcCtxVzB1d1pCd3R4VTRqcXkrbER6cDFwbTY2S1FBM1p5UTA5Ui9lY2tGaU5oTDlaCmJBMERwek51TWNiYSt6MXdZbWh0bm9XV3MvNE1CTkNnMUYwL2F4N3NTQ0VDdzkycktYR3FoQVdiZURGZC9RaThVVjJiSXFkbVNuYkkKc0hwU0lwcjEzVWpjVVVjSkIyT244ZzUrSExKWlpadGp1MUhqM3FDTkR1SWh3eFF6Q2o5cXhGMWg1YjFHSVZqMmR1SVFFeVR6eU5JaQpGTGpkZmxnNTFhb0JkeDZSQkx1Mll5NkxHYmorNkVscXoyYWlDTVRuakdBSE1CYmhOQVhGZ0tYa2ZCTVdPVkpGenMvWmJqV0RUcUQrCjREUGNGc0JyVXNEWWp2VnhGNW5sK1ozMTVUeHQ4Qks0YUE2TDdtMVJvUDVzbHQzWG9FWnQ0N1l3Y2g3NGdHT3RiSStjU1BqMW1RMDIKdVovVEFkUTJUNHBZZVU1S2pOdzZBQloyRzJDZVFpazZrdzhSU1Q0Um9obmRjeEZmN3Q2T2ZSZGhZYU1mNXU1WERrdEUwV2Mxb2FZdApkZXBoQmh3dUFLb0IwYXdJZVFuQzh4Q0VacDZHMFFpa1FoZzJhaEdjZ1dYNlpGbUx4WHcrRXpWcVUrNjNZT2xieFlOREp6am1MeGtLCmgyd0hFMUhhL1hsUkN4Zk9XMkliWHpjOVY5SVZWQSttSDBuMktqcFhkWlhBc1dwQWxJWmNGbWFveVBKbkRoVWhwdExsYU9LcStZbVQKZStncmJGSklJeUNWOVh1UGtCL01QZkEvWUZGb0ZHOUxqay9rTWJFWERHd0lFN2dkRmR1YW9CUXVwcm9WaG5MdHFBdzNyQWdOa1ZMYwpSRkNmVlBQQXdrWXg2RDEwOHB2ZGpaQnJjUWlNRFphVFV4bFVIdTBHeCtnTGtnTzlQY3dwaGRYYmVSRkh5MHdLWkdmSmx3RjlDR0pPCkVKUnBaVFlOb1cwT0dMQ3dtcnN2QTRvU0tRMDdxTFJFUEsvUzd0QlNvc0tmYit0OXFIUnViQ1NBNGJhanlEZU55SUhSeVVqM0NCSVcKWGlhVFRtN1RrclNka1JrQ2ZDSWNpV29TRGlWaDBRaGlrTzdaYmczWHhaS3loYk9BVW1adFlsVGJnNVp4K1VXWlJGckVUY0IvUE5Jcwo2Q285dGNlT1JCR0pFYy9sWlltZU10bEphTWoxT2Rkd214aXowTUtBeXdFK2twRzlhbWRmbWNubC9qR0FEQnNkeEMvcnN1cVRqVWZtCmNKaTNhQW9hRWI5OXVtdlNNS0dKTklFUTNHaGVvSEs4S0tHSVNSdGIwQlc1akNXVk8rdzR5QWVMRVFodTRBcUxVcjNZcGg1TkZEbHAKUEJ3ZEoxaThIeWNXR2pneVpKRE12TnR1UHpRaU9sTEVVbVAwSE9velNjRndBMW1DNnA1UnVFWTFla0orSHplYnkwSGVhTWFCNGRiawpwSzRLdUYzRmJidHA1SVd6VXIzSys2UGdqUllzOWFnaG8wNUxFZmF5OTFTdGRkRWJSUU5IVjhUVEtUWExGbzlTRTFCYi9PVGpma1QxCmlRNXZ6c3NoVlBsSXpQZDJzMzc4NGI4bzVKZUJTREtYMlk3VVFBaGFsYTN0RnBVeFBKbVM1VHJGb2NoNS9vNGxxb1JVa0o0K1hkRVYKSHg5cTRhYm9sZDRRc0YreXV5YlRzU3RURXRnUEIxM0JMUzJVZTlieU9STXgwT1dMblRod1VhMFAwNFdMN0laSU5iY2RJNjEyYnRvcgpSbG9WaXFMV2lKMEI4UU1VUjZBSUZ4bTNYS0xNSHBiK25GQ25SSDJzVGs1eWUxa2pnVkwyeG9XbytsTlRackgyUllaenpNNjVqQm9rCnIvM0JKK0Nna04wTU9yR3dPODM5NXRnNk5TWFJ3b3dERkN5c0w4K1A5WFRVdEpTeDkxUVpSSEVraXVKY050b2dmWGhLbktzUmhzWGwKTTF6bUZhcVRwTStHWWtZQytWRGhrSmZjZHE3OXNNME1SVVptdlFKY1pFWnJzY0lOWUJ0MTRrd3NQTTMxTW5nTU94WU1KWjRTVXRrTApDcXlKdXhOWittUWVGUTFLVnRSUDFJbWpONHlOTDk3ajdHbnhhTUZ0T0lJUnNUMVBoTXo5eGg2cllaT2p5a3dXeithZjVJQU95NGhWCkk4T2lReWZDSUNoamFvZzAwdEladVJyR1EzRFBHTkNoeWw4Nk5SWVN3eFBtb2hvM1EwS2cxYUpkbW52YWNLWkVhU0hiaDVYb05JTlcKOGl6UEttNktxMm9CU3JqeUNUMG1Ncnk2MnFwMXlyaEk5U3lhQ3RnN01ybHFqb2FZMVhkTldISDRoUUt6NnNZdWxBVW5JYXYwMEhqegpZMDhsMzFrYVFORklFNm8zTVc5U05hdUxqZ0VKa1NWTDB5MXdhckppSENwY3d1U1JuS1dxZkRqVWlhK0dLdGhZL0R5TTFMRkxBcGVPCmpxWENvbmx5Wkl0WE1Wdms4TkJnNVR6SkZ1aGVjRW1GV21zNE01SEVoV1VuRE1ld3M0ck1ZYlpJbGUxUmtPZXM1RkNoOW5GWUV2VEUKazRUb2pUbEsvQ1JYQlZnRThYTnJydnpuZjhpVHpScFYrSk93TnNzVWxRVkZxcEZCT2NwaG5kSlg3emxZU25RSWc0YURRd2JGaTltNgpUenFZbE14YU5LQzFDU1d6b2N2R2VnTWNVNnllS2ZtakNEQS8xZ3F3S0dIVUVJYVlES1Bybkc1MmlQVVYxekRxU0Y4NXJnOXEwaURFCklwWnBwR3YxMDQzeEJMS051blVZbGd4U0krRmtPSGlpQmlESGUwYytMQVRSc0xZbW9acmFzOTE3c2hlV0RyNWxydUpnSjViQWNZWHYKdFFrenQxU05ERS9yNmxrUnk2M2tYNlMra1F0M3R3Q2hINDRwaU9FUUNzU0dQdm1mL1JMb282UmNIT2ZUWTlLalhCejVhYXdldXZWdApKNVBmdTVvTkRvY3FPRkZUemJIVnNiQU02OXBUdUNCY0xpZ3FnVEd0NkxmbEpFSjIzTGplbXBEdVJkNDVIRjh2RFlmRHJoalNKYmFZClRhcGFDclc1MG9XR1BUekp4MDNnWWVUS25Ma0luZ0paV0k4VTNzenR5TEw5M21qUGhPWUFqSzA5VGxWd08rWWdPQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaS9nblNRQ0trWm41Vmk2UG1mYUliRWxpU0xDcUVtck5KdWtPYjRRRzJPNENVc2hCV1F6d1JNUExuaFMvNHh6RjE2N1BMUUNBMDZrMwpxdS9FQVVJd0krVEVEc2VwUWVXWW11eC9kcVpGbGFYRFNrRzRGK3dRejZjclB4UzA3NmFIbFVPakNhdXF4c1owTVFDaWlhd0x4Uyt3CnBUQmhEejc2anJ4Y3gydnFlc3hRNGRQMERaSW5oZWsvSzNLMEpPQlNNaUZxS0dDbG84NWMrWlIrZlRJa3g0YXl5ZUtwWGZNQUQ1S2kKV0dqTStRc2xKc2Z1TU1WWGJ6VGlqOThQWVV6bnBEQU12UlMzK2RYV3FVS2ZGUjdjMFBLWWxsNGRuaWYvQ0h1R3NvcHhSS2EzOHVOVwp6K3h4dVJ4MmJxN3VvUGZNNnFtMjYyUzY5SnA2NE15a0RSY3FaZDVDaDBHYmt6MjB5R2xCZVZ2dTkzYkdJTE1BVEF1N25lbERBN0FWCkxpaW9aYzJPZVNGOHBJcDZ4WlVnNWdvRlo1M3lZOGY3SGJKOXVnTGIxTFR6M0FhOTN4SEIyT1NHQmU4OUg2YzBrM1ZOdExCUkJYTGwKcXJsSnJnZEs3RHU4RjVNdW1SdFNrUE5mMVduaFVRaDFXMWcrYUxVc2RoUW9FWmt4cmwrU2RVMU1reTQvemFFNm9xSElVenhOTHExWgpSRld6OGh4ODZEQTBQMTZWd21ISDJkUGVrVDNuYUUxT2tFaUQ4UURqclY5VXc1M0graVZkWkRGSEVDNmZMckk0cERNalVvOEJqU015CnhwSlF6bEFWOThqWWxYSmRNYTBSM0NVRGk0Tmd5UDNzS0lBaUFzMTYxNWNiRWNMQ0pRRUNOTjErejU0aHViVFduRkk5eXFXaDlrYUkKVmVra01KSlFlamJkSy96SFdHMTNWYVFtcHMyeU93MGhXakpSVTZKRXRGVURDeVVNc2FNSzVORUJpYm1yN0s2dmlUUjhOcW9vSG9JUQp1TnU1Z2hJNmMxZzVqRUpVejVET2VQeHdtZFZSZEt6V1VFN0F5UEFjNWtoOEVEQU1COUVZU2VTUjZJaWpvSCsvNk9XSisxKzlQc3BSClBndFZNbUtMMU16d2hxRVU5ekZNRktJUVJXTTU1Q2NOamc3d0w1VnZJSk9rR0U5WWxFbWlTUExhREZtZG5wUjNVQjRkM2s1MmRmSDIKa3pLWjE1alJrYjVBK0JLSG1tUG9UZFJVM1F5WlNHd2VFSmVKa2dxdXcxZDh2V0NnNlNNY0ZnZWdydysxMEtzckhCdDdLcUtOK25wTwpwckFRcW9HMmdpdnJXSHBuWVhsbS9DYjhTTlpYWWQyTEgxaEtjc0hocHUrRS9LdjRIS01yOWNRN3kzS0NLVjM0aDB1c1BLUmFxUU5jCkFibGh4dUtiMVNYd0swWUVNMUN3RUlWcVRCRkRuSzR6cXlwSW9JV2hKcm9mTWRQVklqb3RyRXlNY2pQZWpLb1VBSSt0QWFvcVVLSWQKbXhzb1l5d2puQS95UTZZL1FOMUFubXdiNWxDb1NUdHVhM2Jnb2thUkRuZzdVTFRtbW81QWZwY3VRYlVrNzI5dlYyS1ZOc25CcUxjRgpWY214L04zVzFaVHR5T3hQU0tIQlVpWDNmbVdaV2lzdDB0RlZIV1NoMTVCc3JyT3V2bk84VnBWaHAzYXE2Z2FGSnBUWnorSkhvaytmCkxXSHNBRDdhYjR5bVI3bUxrL2hOektFbndnZ3pMS3MydVp5WlVoeFlxUDJFOTdwSFBCUnEwTGZ0SVVjWUNuTXpZOG1BQk55ZHpNeXcKOHdBLytpVmdFeG5OcGtsU3lnZThIR1pFK1huaEV3eEp3bDVzd1RxclZSeXFSbFRzTE1sQ1Z4dExuNUZETXJhSnBIRHJwby9IckRJcwphMGtHd1NrZEJvNzRWUm54dUVncGg1YVZtc3hvNE1HZzhEWDdFMUY5TGFLK3NZQ2h1cEFlRERJQjFJcEIvcG5zNVM5MGc4ZWd5SmtkCmJ3VTlFdzE0SzdvekRZOEVKVGtKRHdJK2xVbUlXSFVKQWVwMnQ0b2JrTUhhOU1JcVF5dTlRSkc2a0hrSENRYnkyRHRLVFFSL1RtTE4KcWFVNi9UbGVaWEYxRkxlSnB1SDBjQkd2MFdSSHQwdk53bkRaTExhaitKRktNYm9OTWZac2E3S3FocnFoVW4xcWZKTFV5OHAxM3lMLwpUTG51SEphYWNzSnhPcHdoVm82NXJMNmpMckFlbWdLdGZFNVE1bUdsZ1B1L0VDR0NSWW92Uk1Rb21zdFhUU0Yxbml4K0p5ODM2Wjg1CnFtQU9ubHFIWk9VOEtZekZpamltYUxFVEVQYmlSWDA0WlZ6MElVZzhxVXVCakl3WEhwWWQ3bnZXWmFWU1JrclhJa0xCc2VTcE1LMzIKM05idVNtdW9idEtRZGtIdjRoZFAvM3V1SmxoNUlWalIxSHZOQWtwMnFXbWlRQXZOQUI1ZW94bzlPNzBJdlRZVkN0Z214ZEl6dTRFdApXeUJBOUlVNkM5VVdwQmFsTnQzdVJQSUV3YVU1RWNGdWQ2ejZWb3JhMVVVT21nVW1ZN2dLVERmdEF4a1prcy9QZmtNOUNQYnhaWG5VClcyNkhodm1MU2c4bExiQVJucVdtajcxcmxndFpsMG9TR0JQa05TSS93bXc3TmYyUGFralY0M2tvQ293SUtNVjg2dFFjTld6VkJjZzgKLzZ5S0U0SjYxQlN2RkVOVmtCS09wcy9hc3ptSmw1MkZMaTBTZUJ0bzB0aTFtVmM0UWxpS1gyUmxGbjZIMjBpc2RzNXpXb21DTC9uWgo4UC9IM2gxRU5ta3FYRWlPQldwVVZidFp1d1VZSU1qdmVxbEtNa3ZsOFZSd2dsWmdoV3ozSnY0azJ6Z3dLZ2xXMHpnMUMwcVVwV1J5CkFDcEx1ak94OU1rWlMyVVNJQkFpMmpNME1iRFdvUWlyUXRycFVkeVEyL0F0aHdBc25mSSsrYVpJSnpMU2loOWdIQVlXNGxOcU1sME0KSzRtZHNBWFNwamdsckZRdnlwMVMzUDdxWHQybVJJM2pqU2wxNDg4SVNGT0hEY203YWk2SlJMY21jYkxhVWQremZKUytlbzY0WHArbQp6TU5DTVFjc1BOdmNGQ21PUFlXeHg5SWtNdmNLMU9jV1BKTXA4Z3E3b0tRUWZTQ3lwMmM4Z3RDU25YbEZVUm9CT1UzVEd6OVdKQXNVCkw2MzZIdkE5alNnOVoyQVB5U21GL0I5LzdoRGE3MWdpcWp1VnZFeVNKMEFyUXRvT0cvQlpQTUo2eUhKWGtVQmNRYmtMa2FwWnRaM3EKVXg5d1hPN0pkN2d3U2hSUmMrUXF1bXFvWGIxYzFPazRFYnY3cUNxWkRXVlNET2MvK2xtcTlBa2ZrZGdIMFJ1cE9nUk1rUUhEM0RXZgo1Ym5pcWN5UFp1VmNwSDl3VG9vcFdnazF1akxIZFgvUXNMSWJBR0ZjVmIrZ01xRWFnZWhoRGdvdDUvMUpEazhEQ0V6Nndha3B6MXJECnFXZ1hqN2s0cjhEclpHMGZia045RkdaalF3d21TRkg2bjF3cnJtRWY5YnoxNXU4OEtxb2lYZ0dTR1FaOHExZU4zSVFhWHNwSm84ME0KNDlKREdqWnEwM2w4MW53QlVrQU5DYXJPVzdGaGR3Vng0UXFzS1ZWZEpCMHRmclBETmMwZlRremxqYUJpVGc4ek95M1Bpc2NpL3BFKwp6QjdzQm9oRytYSjJGTkh0WWFSN2RZbTZwY1NuM3kzaVlTVlQxWDFTZmd0N3JxRGdicDRWcktyd0NvcEVkNEtSRmtaUitsQVVSWHVpCjBSVGpsNCs3QWxSM0lHVC9FR3BJYXBCS1VOU0VsWUFlWnJTd2FLNW40bmFjOHhCVWRxa3lQL0Urcm53RThwdGNKOEU2dTc5a0JqcHcKcnF5bTQ3ZHRsa2VMS0IrczlHaG9aU0Y3cVk3dm9yR1JmdEZLd1NFWjZjK2VaYldjSlVUajhXeWsxMjVhMVlONEdBZThhdndJOTBRcwpTdFdSdy9LaXBNb1MzamQxVlFzMVNuVThMSFpVdjVLbzVKUkFxY25pV21WMENtUWViK2lyMTU3RFlBeUlwZkhDUXNiS1lRcXZ4Mk92CjU0bFhuYUpkK1V2bFQ2TE1NaTIycFhyc0FOUVM1ZGZkMm4xa3B5TXV4TTRiak9qRFNnUUNZcVkyS05tWDNER1k4OXF6TDdJTGo4OXAKa3RlR1EwMlZGeks3UXpsSFNyWkVxVWxPbG9XaEtHbWs0dm1rdWdpZVpLNGN4WHlSU0F5ZlVOd2gxbjh0MVcwWHVrY3M0OUtFSzJFOQoxazk3NXNJMERKNnJLa0xiOE1UOERGZUUxaHBUdGNrZTdhcStWUk1FTGt5bXBtcTkrRmhKa0QzMWhDUk1hNHQ5bFhMYzBKRWk1ZUk1CmJBbkdvV1FXT1FORkEreDBmWUtBRzdpYlpKVDdGQWZIYXFpWmhCRnRxcDVpWm4zUHNxd3p5aUtIS0lrS09WZHpmeWRtNEZrdnpkcGgKT0tiYlQwT1lkM28ycGpxZDdueFhHVHpkRlJvbzI0Tmw2NzlDMThIeXVFZFYya3FINTRDc2ZWa1lmTmRsaCtTYVh1TVAxVzB5Q2NzMwpEUEkwbmtTdzhaQ2RNelR1Q1pWeUZabERFOFpqWHhFaHk4ZlNZWUZYMlJ1cnFPSmQweUlzbXlzQlZBbGRJVmdEZTZMMk9qaldNdjdOCldjbDZWbUQ0QlFrc0VNT3EwaHlyMUJmdG9vY3p1cUtub1VWaWlJU1l0dTNHRTlLalE5TXpqcmpvcWRmRnI0Z3NaUW9QQjRGanBkRzkKMFJweGIxemp6SUFWNVpmcjBmb2lVcDV5K3RmaitRbmI4UjFIRkxKVTdTazhCU3piMlVCVFNrN1hLNkRvU0o4cTZPanRhT0V3aEtPSApxSVIzZ0N1azZYVXRybFY1eEdua1VHS0hPRU9YRG9TSUdPalNydTNZQ3BwbFBzdFNoRzFCZE96czJhTjg3VEg3Y01wRlVHSTJLOGVyCjVYdFk1RHRPcFEzT2RnenZONlZaV3IzL2ZvNzBibHQ1dFp6WUlQT21RZ3VpUy9wMU0rZ3lLMTk1NzJCMzAxcGNkdFM5V1lLb2h3WlMKQjliTFBTNEdBeUhhM2IyZFJGd3JtV0tBbnh6ZWN3ZjFpV2dicmtBVTRTb1pwWWI0TVZFbWtJQ3lKR0E1YWNTM2xVUm1SU0pGWkFvbQo4c29TZ1BJMTVtaEZWbnBNM3l2SVlKT05WZjIyTTdxN05PYXZBRS9QSlEvOVovK2VFL0pMSVUzZVRLWlRZVEdHUzZvaTdIZ2dadUh2CnJDa0NFSzVESEQ2MndjMjZTVXBtc1ZsQmFIVVF4bThLak8xNlJsYkJzVVFwa2RXV3JJZFpUaExxSjVQRjg4ditBdmVrdm1aUjhVK0QKL00vbCt2L1lVV2w3WkJyR1Vya2dWUnRzWnV4aUs5WXM4ZGl0bjJRcis2TWdLdVNDMkNxOERVSklwSWlJY1RxSDFZNUdBbE9jMVZqUApPN3dDVzE0RnNteU9wVW1zNDJTWlVOOXFlcDBab3YxczY3SWtReUFuZzV1VlIrTWJGZEU1bWpURm5wemxZYVZPbWhaaUlkR0phWmVZCnhyRm0zTmkwSWh0ZEg1TjNsdk54TEdTbTd4Zmp4N2JvTXBOaU9pelg1bmI0VEI4RkR1VW56ZDNjeHhZTkg4TXcxYjBkWmhnRytPR0oKMGhtbjlyOHJ3NzhydlZnandIQXJWTCtQNElTUE1tNkRrQlh1cHdMNGNVdng1Nm1DMTVvR2d4K1QwMlFXV2ZxaDJuQnVFd3Nyb0lBWQpEQzJ1S3RMS24vWGJMdjQvbG53WHF4eHJrcENWV256bnczbEoxTEczWGZyVjVsWUhFUzdEcERRNVRUMGZXS2o4b3VheVNrWnQwenFxCks1TUtxa0VvV0tXSnVsclZ3OFA0bnVWNGIwOTdUMElsYUkxZkVQazFtMFRFYmRRZXFxZ0xXY3pOaXQrbllpUWRrRUVzejRjbnhWbWQKRXJlbTJxdGRrSkdNUkNXSUUyTklNemcrcy9uaEVQNUVLRklFZGtMbXcyVWpyeDMza1k0OHdGY3FCL2Rxa1hpTlFuWEFrSHBSZXo3cQpFM21lUUh2TWJSaitvcHMxc1pRb3hJREhsVjVjZ0laK1pnbUhhekpaRC9EWnovcnhPenB4LzVXai9iZHl0S1BDNElYUlJwUXNEU1d4CkdXRkVUSnZSR0VPMEVjMW14T05tYUpmbHpHc3d0RUdGWDEzbFd5eW1nTHRMdXZ4TjBFWjVKc3VlRE5DT3psT2JuNDNsR3Z2djNQanMKdkpRdzNmUnNNbU00ODBjZCt2SVljN096dVZ0U3BRcmpjamo0c0Y5Qi9FaGVLbGE3dWRuMUNiU21zZG1JRERGYkVOVHNadjNjQzVvZApmV2syTTV0RWUyYzRxYkdwMXFPOWlObkhhR0IyZGRQTXpjc0dtcEF3aVJ1WERiUlJMV0pqY3lxdVJTdTJEY3V1Vmc2OFdObE1ObVpWCkozT2dxS0dvQ2xKMmkvbjJBbVZEQml1ZXM0UGNBUkRjbUd5V0NGUVJmcU1ndncxWFl3Y2tHOFhTSEZHRGtVMHBReWx2UkhaekFkRW0KWktPM1dyWXdINTIvaXVvV2J6NDIyNitab1UwaE13NlM1NEZqTjh2M1hteHNBdUJhT1doc3hKL1VVczlrYkt6K2hrOXdZMktaQ3k3OQpjTEZaZEtiY0hCT0lmWVppN0lKaW85OU5zVHlNTXl2b3RNOVF0US9qYXBpaXlkdStpZGljeUxzdzJRUmlzeDdRNkhIaTY2SnM4SVhECmpxcTN6Y01tWlBqYmhtSHp6NlZuczRITnFDcFRBdGdvYkpHVlJZY2dDWHRVMFZCdUR2WndtR1Jqc0Q5V05FeCtiUXIyY20rL0Z3UWIKcXdWMlJBd0c5bExUd0NCZ3I2UWw0Z3VBVFVHTjlxRjdoU1B6dFF2NjlYSS80UmY4ZW5ablpZTjlEVUJFSjU3YjZPdXh4Tng2a2EvWApWRS9qRGI1bTFWbkpxaUZnZ0pjTkpVUkN2Sm5pYkROUkpTSVdKeDBKVStHckRiNkdSZG1ORzN5ZDZFS25FSld5MDBWMGlRbndOUzBTCmxNNmI3ZGE5REE3d05kYlBUMmlHa2IzQ29vY3B5QnQ3dmFyVGFvRzlSajhPYlJiWWF6YkVZT3p0NWw3TE9sWHZxZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJaE0yVExQWWZodEE5cm5pOHVkZXdEaW5vemIxbW01RHVza2J2cDFqcHpiMWU1cmx2N0hVMEVRcnFOZW8xbXRkeUczcU4rV0o1WmMrQQpzOWRWbTNpOVpnalhMdUExakV5QkJ1OGFjWTJSODdlTnU4YlpOS24vZGlVekdqd3JiR1BXOVJvbWk0Wk9lUTBuSDI3U05kYTZUTzBFCjZIbzIxY2dHNWhwbHU0Wnlic2gxZDV1bXpiaHVTeDdiUmx5M2kzRzRoNjVtWmFZQjF3Qnk4S2VEYjkya3lIelJyWnZqY3NHMmJ0TjAKMFVCYnc3Qi9LYkt1U01kUTdoMWc2Mmo0R1Z4cjZoejFLVzJxTlhNVDFDa2FhdDBqYXhwTTZ6YjhTdDFJYXlTREZLTnlWZ1Fhc1AyRgpjSEpNVG5IZVBPc2FsVitCczY1UGFEQ2R0VWM1WkhNUng0WlpWME4zTnN5NlJnMVRzS3hoR0cxOGU2R3N6N0ZNc21iK2QraXJvdXFYCkpUS3NuRDhnYXl6cXBzVm1YRFFnbDZoaUlXT3M0YXlSZzMxanJITS9CVVNrV0dkT1pQTHhwS3Y1N0FsR0tGVmFic3o0NGl4ZkRHdlUKeDNEdEdBaHJRRkthZWRVa1dHT0daMlRoQmxpVGlQSW9qazU2U0l0aXQ4Qlh0K1k4NEUydnhpcUhTTm1BVitQWG1FOE5Kalc3K0tVMwp1WnBRa0J0d1hZTjRIZHpxNkNMN3dsWWo1YUtVcnFuVmRVVlkzTkJxSk9NWTY3eVoxWUJpODgwTFFEVk9xUm5uR0FicEdHOWdOWkRsClJZZGltU0QranBwVzVudGhVQkgrQmF1dWthY1BWald1bFpORm9LcVA0U0pWc3lLeXBrT3FidEhIUGtEVkxRcEpiazUxaTI1VndhbHUKVVVvU21Pcm1ibmczcFpvbEh6SXhFbzdWbjlJMlpsUmpBK1ZmTDBRMXpvaDNMUWpWSUV1d1NqMEExYTBxRm5uanFXSFRoMmcrTlF5YQpONHlueGlCRWljMU5weWFVaEJoZnc2a2htbVRvT2VEVUFCQ3BxdWxpVXlORnE3SGJhT3JhTEdJTk1qVSthR2JxYmpBMUZTT1BzcUtzCmRhZ09XbXdzZFlscDlxWlNJd2wvTTZsclpPY0RTVjJDVG40VHFVdG9Td0pJalFha0tsMDBqNW9kU1MwODJEanFqREtVcE4xRWNGR3IKdnMyaXprc3hvNXRFWFpqUWxEeWQza1JoWms5MU9nemVsbUp5NzRXaFJybThJdWltVU9kZFhCbHdhY0JzMHZyMllsQjM1NzNDOW5DRgptWVZ0OEpvWUdVMTNQVGdFYWk3UDJpRlE5eWpqRTMvNmNjTHVoWjkyYmVxaFR6OU9TRzM0Tk1iM21qK3hweDh4L1E1Nit2bVROM2dhCmZsVjZZNmN4QjZKbjhNWk9WelpsbFk1ZVZZOVZ1ZHViT1QwWmhHN2ZEblA2RVJicklLZVgweW92NHZSeUVqQ0kwMXkvSE53MC9od3oKdmVmeGJBMzRoazF6cTVJdjFqUzZSeHBIZlZqVGp0TnQxSFJYQ2ZraFRXL0REWnJleHVCTUw0Y21BaC9ORUdFYXg4QnpiQTYvN3EzcwpHRy9HOURFY3hQUzJCV0U2NzZyUEFFekhxM2p6cFZFTTBFZ2pGbDRhU3lXMkZ3cTY5TU5ZWktwdnVqU09rTnVZZ1pjV3BxRG1nNWZHCkI4MHV5aSs4OUVOSVl5a0hMLzA3SnQxcVQ0Y3ZEVkxCbU9aOTd4RUx6a2RuSGovdzBnWkhiTHAwRG1MMURaZkdLcHVwaW1CTEwvcXEKN1Z1d3BURVN6Zkx0alphR1o4Q0tkcE9sSC81a3Rab0JEaW5LeHovT3p6c0dXUnBlVVowenVBd2ZreUdHTHZiaTNHaHBPUVhTQW0yeQpOSW9sQVVFOFlHbmNxbVM1NHFPUGdHcnpGMVk2bTBpd3FkSm9TUDgwZ1NKSU1NQ3dKVVhSeFpTR1lLUzcxNEpHYllqcmpOVlE1Vld6ClJ1Y0dTcE0vMmkzR2xQNWJsV3liSncwRDVTQTNUaHJIS2sxdUZJVHp5TkYzcCs4bHlXMk9ZOTBzYWJpRzNiMHhpRlZoZWZqVXRiSUsKa05EWGtiKzlRTkxiR0J4cEtDSllUeHdZYWQ2aVZOOFVhV0pPeWpnUTZlS2lwTTJReGhZTStONElhUmo1VUlJZ0RTSENNK1lCU09QcwpyVTNaSlk2NEFBNU5RWTh1UzRqaURZK211bzArNVdGSDE5RG1CRG9hUlJOYy9nUVJHalFoeWlGdWNEVFdHTkVWazhiK0dCb1pzTkp0CnVLblJ4MmhvZEZ0V1h3UXorb3RUSFQ0M2hpQmo4aTVtdFByeWpINlkwZFRKc1d3dm1ORlVDRkltZnlHajhhRXlGckNSMGRoTUJPRlEKV0FGanpGalBSWXltTVYzY1o3M2NlVzFnZEdJQmFodHZZRFRlTDNJRXJoMjcrb0lZR00yL3AvbkV6OEd0RCtsUk56QWFNa2psRWdNWQpMVEZTK1VTTUp2U0JSYVZCaktha2tzSEZJRVlUNnNNYytrMk1wbFVNWVJPaitYaEdiNGNZVGVrSzgyNDNNcHBxbFZibVJrWlRxY0p3ClZDQ2p1VWt5WVB1dzR5Q3ZaN2c0a05GVXFqNnRibVEwVkRpaUZ0N0lhT3JhQlFNMk1qcVI3Y3NDQXlPajhVNktmSHNqb3lsc1pwQTAKa05Hd0VJS3dtZEZpSTVtVWZmb0ZKdlZYMnNob3FJK1VPUXhrTkhYQ2pEM2Z5R2lxeXhoaURXUTBHMll3dm1wa05BMTh6VzlrdEdScAovUkNqYWNDU2JST2pZV0hkNEFzWmpVc1MxRG1RMFJCcUsrWWR5R2pLa1pSN3ZaRFJiSzRiM3hGcnJSbTdVa2JReUdqRUpab3h0YUdXClIrQ01NZHdBUnE4bW9ldm1SYVBObnBvK0hsNzBhbEhHYkdBME54b0hGNDJqRU9oNTA2TFhqT2RxV0RRRGJvejhCaXdhbDBIUjF3c1cKaldLZ2lMS1RGWTFPN3VSckJpcWF2RjJWNGdRb0doRlJkVUUwSjNvVzRmdzJKcHJhbDZ3dzg2WkVvMCszMmo4YUVnMkRHSjFtUkdPMwphb3owUmtRallxY2laUk9pR1JTa3VpRUkwV3p5emJ6aFRZam1GZWRIU1EzbHBCNzNpTnFFYUZTOTlqcSt2UURSeTVXdG13L04xdHJPCmV4QjB5Szdmb2pkdk9EUnN4UlhOWkVQak1Bb0pDdzNOWHVDUGtKZEJoazRVSnlUakdOU0VKaWlvZ1liV1RPS09pQnNOTFE1Y2NUOVMKZGpzamIySHBXQUtMZ0pyQXNmMW1ROFBxQW1pem9XbEJzNWRnUTlNUVVPbk5ocWFWdFVuQmh1WVAxQmtrYUhqalRHaXQrZTNGaGtiQQptV0s4ellabWFZTUt1cU1BQkZYTi9HQnVPRFRMS2FoaURqZzBLaFNFN3dvNE5HK1FxaXd2T0hSUzhmdjZ0dUhRN0xmTkFIekFvVm5iCjhKZ09zK0hRckM3WldHbkFvV2xoSENqZzBMU29zK0lGaDZZU1ZTb2wwNkhaVTZpNXBsS3lEUEFpdXNzSU54NWE2bFNTMDQySDVuYmsKRXdVZUd0T1IybnZmZUdoNk5XcDFhRHowVWJFR0hocVdHcFRualllR1ZVNkg4ZEEwTURvWmVHaGExSHpxd2tNekZzZXFVTk9oMWRuRApNaUNoZXhCbTR1QjJBNks1T0tKQUpBalJpZEJmWS9ERmlXbHVoZjRpUk12S1Q5ZUVhQjVMOWFzaVJNT2diZzQzSVpvdFVpaGFDRUswCkZnRm1SbXNwWE1aaHFHOUN0SXFubW5SMVV5VTl4WE45SUtLNVlKa3UrdCtJYU1xMHhaTTNJcHBLYm4wV1JrVFRvZy9nWWtUVFN0RkYKTUtJbGxjOW1BVlF2d0V3MHVCalJFc2JyY0ZwTnd4OVpKdEVURWIwVjd5OUVOTDFDOW04T1JEUnVtUVNGZ1loV05PTVRJWm9SRGRYVwpHaEhOY0FhbnVHQkVLOERSamU4SVJuUTY3VXpNaUhaMFpCNUdOQ01xTS9BZCt6Yy9ybEorV2pDaTZRVXF1UjByVnN5dm54SFJXQXhJClNCSWNTVmJhcUFpVWlHaVMyWko3S1c5RU5BTy82dkpnUkRSZU13SW9naENkV3JUTHZRalJMSitpeWlZSTBXd05LSTJRQ2RIMDVIT3EKYjBKMDJvS0JJRVRMY3ZqUVgxY0FlMjJBMGZjSnVYL3dvWkVFWk5vdThOQ0o1SXRIb0NQNWQ4QUJrdmgyODZGcHBUVFlmR2djWDVMegpBRVRESWxuNkRZaUdWWEptODZGcFVGclFnR2habVBDNkFOSDRSYmFtQ2o0MEVwUE1Cd1FlR3BtOGdQZHRQRFR6a0N4VENqNzA2dFk3CkJ2WVpRMXdrd1RZZGVwVEl5TnJZbzhOd3NLRTdxc1Vka3Qxb2FCZ2ZzNXM1czhBZzFJN0IwSkJTVDBXd3RtdlBkcHJVV1pzSzNhUFUKTkxicTFSbXNtd25kM2Z0Nkk2Rkhjc0lxU00vb3E4MHA1Z1pDazZpODZqR3lOM2FUUHB3NDZHMjRhZERIYUJqMDlIeStJYytBT2FtQwo2MEpCaithdytONnFDSHV6U2REYmNJT2dqMUVjNk5HdFBnME1OS2dTQkx2ZEZPaU54QTRJTkVMUFRBa0ZBeG9HTmErN0VORFlMVGpPCkRCN04wTzRFQUhvK2Z0MXYvdk9JRmx1QmZ3YkVSWDBEalg4R3RVUjB5b3YrVFBTdkEzU01wMndXY0xDZlJ4SlM4U0kvdzdRc2V5TUUKQ0lZYURlSXh2UXhEbUcvczgzZ2luV3ZxODNCRHBBMTlob0Yxb1RmenVkc1AyY3huQkVCWm94SEk1eEVmN1VFK2I2UmFFSjhCWldOYQpPSURQNElSdUZuWmdpV2tzTWpJaGo5M0VBalh0K2NNZ1R1Rk5lKzVKZVYrem5oR1FaVm8vVU0rNllCbnVYS0Rxd1FMMGpIUzMrbkdaCjh6eThTbjFobnRuM2VkVkRlZTVhZVczR2N3L0k1bzE0NWluVkEzakdEV1lGalBITytMdll1MjFuSDJGK0F1N2NBNmtiYk9mcktKdnMKM0NNekdtRG5FU21rb0RqdmNlREdPZ09ZcURKZVU1MHg1cVViNFR5alYrTE5kSjdkWXZTOTFUS3lQWWpPa1BJMWs1b0Q2RXk4NWF5SAo1d3hEOTAwa3pubUdoT1RHT2MvZ1J3Zk5HWFVPVE00RnpCbkVhdmJqdkZET2k1SHNja2pPV0NvejcyV1E4Lzc3NWpnZm96SE9RTHBFCmYyRldiczFpWXQ4TmNWN0JTUXFHTTlhUyt1cUQ0WnlvYlhjenU4MXdobFVMbUlpNlVYMURrdWJPcTJONVpEanpidUVMYVJPQlZJRncKaG1Xd2ppQVl6dHlHSC9waE9HTUcxZlFRREdjMGVIZXBMdEw4V05Qd2hiajV6UitYUjY3SXhqZnpsSGgzQTkvTWd2NFp2T1ZkUkFLbgprUmNkL0daVzlFOURzTlZaTUVYWDdadmZ6R2ZKUWduem0vbEtOQU9pSlY1T1ZqTysrTTFzRXhsWG9GQTNQRDBPWlFZNGYvV0RmdnpoCnZ5akFtWEZCVXE1dWdET3RsRGdFd0ZuUndwSVBzSmxoUURXTHVCRE9ERmRSSHhRSVp6eFgvNElSenVBeDhnVzVDYzY0Y2hVWUJzSDUKckdhRDRLeHZlbW9DUFlGWmRueTFENlhNV283Nnk3WmpsdDNPU0h2RkxNVmgyUVJuR0tRYUNJSXppMGZWOGVFaU9PTXFwVTRMZ2pOZQpPMEdiQXVFTTEwNkNzcHZoZkR6WVlEano5UXlwaGdnUFpGSU1wYkEydy9teW11SE03cjBNL1FmREdSYkp3MjZHTTNFUFZCd0Z3emtSCnErMEtldlVTaDZDV3c4dk5jTVliYXpXR0djN1U1YW42MVF4blBGK1ZJOThNWjFTbmtlZ1ZDR2VVYWdtWDdnTHI1UVkvTDRBejFHWEIKbDZmSER6ZWFRMGZ3bS9HZWNIMXk4NXNaNE9Gd0hmeG1CbmpFSmZCb1FVdHpEZWlwbHFMVnJYMnA0K1N4V0NRZC9HYitaSlp3WitPYgpHYWlNWnZRcU9Yc2VSUUUzdm5uTllHd2ZlalBLYVlSWE5yeDVEcTEyTjd1WjVUVTg4d3Zkakc0d0FrR2IzQXpwSkN2MUE5dzhvdkx2CjVqYVA3dUV4c00wamlwZUQyanppNDdtb3pWallMQ09hR1JRWkp0c0dzaG5rUE03N043RjV0Q0JJR05nOGhzdWlqV3NHSW94Qm1rTnIKUnRzWURzMUJhNmFzZ2lYL2hqVjNCeDlmckdaUXVoZzNDMVJ6TDI2OVkxQXpzVjVENWRDYjA4eE9SNDl3enJ3c0hJYXZZRkNhMlgxKwpLSm04MDNJOUtvQ2p0SnBpUDBNWVdCZUpxNmlQR0FrYjBjd3U3MVdmTlFOUVNOVHhXd3BBTTZocjlFQnZQak95ZHdRakI1NFpFQUhHCnhJTE9YS1A4OUlZelF6WTFTcWp4SVBNTHJ6RFF6TVF3ckZCM1dqUU12UTlMNHdQTXpGWmZ1Und1TS9qQlZCZmRXR1pVNEdxTllDcHoKYTk0cW9NeFlGN0hFOEdZeXc4Z0ZTRENaSVYxcTVpaHoxUXh4azBpSkY1SVowd1RCOUVGa2J0V0Z0ZGR1cW1pOWVjeGNpaEhnWUc3TApYamNFanhuS0VzN1NONDRaVjhCZkN4cHptNmU3TnljVDFGV0pvSDNCbU52d2x4WXM1aGF6VjZDWWNUN0ZqTWFkQk1lc3dnS1RJREZqCktocVhxTE5OZDd1NE1jeHczclg4TjRVWnB5WkloQ0hNRURuTnRGNE01aFdMdEdBd3J4YTk5NHhnWHQycDQ0dkFEQzJ4Q21rTllGN2QKUHg3OFpVRWJ3ekMzVGxqTm5BeGZYczRGYlBZeURQRmJHNzNNUkFmWEJvRmVqbVRFSmk5RDVFWHF4dzFlbmlNNktwaTd2QUt3R2RqbApGWUh3aTdxTVJJdmVtNzRqOHNFY0NEVXoxeitVdzkvVVpWcEZFN2NNTHBHRGE4V2R2Y2RxanNsTlhZWjFzZUEvcU10a1JQbTlrQ0JpCk4wRzVvY3ZYNFF4ZGhrWG9wb0F1cCtSQ3R4ZDBXU3VmdFE1MG1mbG15azREdWl5UWdaVmxoMDhQUDVEQ3pvQXVNdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJemNzNUxhRExYejNJQ09wOVAranljck9wRjNONUxRRVdObklaVmZPc2p3bmlNcHlIWkFUejFob2hIY09VVWZDV1lWQnBzbkhMMkkwSgpxcHUyek1MWWVsakxLNERKZ1ZCV1FQRmlMK3Q5aGtpVEphK3hHYmlQNUFZSGFmbEtuRjJrWlM0TnFJc0kwaklYWkV6aEIybVpZVTZYCmtHNWNNa09kQWs4YnRNd3pVNWU4Y2FLYVJ0dDkyck1ieXF2KzhUQ282R2RFaVVkMjZjbkZXV1k5aCtxdHpGbm1aUS9XVjVtenZDMDMKWnhrN2ltd1NuR1Y4a2FUN2I4NHl2S3FxcXBXTHN3eXIydmtHWnhrV1NuazNhSmtPT0IvUkRWcW1sNWExR1JPRW9EU296RTJZWlc3QQpSM1pqbG5saWpDUUhaam50bmlTQldXWXBDQWZkQzdOTVkzVVhCdEhVWU5Gc0pjd3lCejBXbzl5WVpUcVkyVUw5b2hWRlVzbjJ4aXpECm9qS0ZHN1BNSmJEbURHT1dFd3ZoaW5TOU9nbU1IU3hkdURITFhCUlREeDJjWmF4a1dRTVNtR1VsZFV0OVk1WVpOeUdwSXpETFhDS3AKVzRReHkyU2pWY3MrVDhROWgxWTZNTXRrbzAxdnhrZWJnd0oyWTVhcEptRjB6SmhsR29xaHlnemdjVWVobmkvTU1qS1d2di9HTEVNTwpvczVOZ1ZuR05ycGhOMmFaYU1VZVF6eFRuY3ZoOGhWc3B1VVl6QTFaSmsyTGxUVjd1OVlzdEEvS010YU5lbmx1eWpMankyUTlCbVVaClBxWWNqYUFzSTNhZ09OaE5XUmJYYUk1RFdhYjJUNStnS2N1MFVFcC9VNWFscE96elVKYkZ1Q0pNeEpSbDdxa3lxNHV5ekJCNXdMWVgKcGU3SnE1MmdMSE1oS1hqNFJWbVdmSExOUTFubTZVZlJLaW5MQ0dBSmYzRkJsbUgwTHdxeXpEQ1hUc3lRWlZvWUVMb2h5N0NLOVdmSQpNamZUdlRCa21jZE9iaXV4SWN0YzNZak5Fb3pMc295R00yVDVHRzdJOG1VMVpCay9vQ2hMd0pNWkxsSUMvNElzWTZrbzcyNXZsNzIwCkNzYnlNVnlJNVcwTXdqTFhjOHJWbTdDODM5Y1hZWm1wWnhJR2dyRE1rbmVxQm9Ld3pPUmh0TTdZZWtsYWwzMUJmZlhJSG5LMUpNSXkKYzREeFp4VFBTS251cDJHdVkzT1dMUURMM0lZcjNodXdMRUh5VElldzdDREhQSVJsUnFybUo4QXlzWjFQam5ZRnlYa2hJaDhDc015dgpMekw2VnplYmFzY2pBTXV3OUdKMWdFaW9yY3FkZWdHV0dSc2ljU0FBeTdSb0hoTmdtUVlKRFM3Q01tOC9NOWFCV0dhcW00SzFRQ3dqCkVLQkt6aHV4VExTVnV6T1FhZ3VWV1ZlM1FCT1dNZGFwdmRsTldLYXVJMGZ6Qkk0Q2NIMlVYVGRobVRHVGt2SWJzUXdybWVBYnNVd0wKSDFJd2xtbWhRUEZtTFBONFZPVUVZNW1SRTVWWHI3aE1GL2E4R010MGFMTjdTVGc0WnU3T2hpd3prZEJHOUdhSW9XZGJBN0xNR1c3MQplaURMdkdmc0xYOVRsbUhWaXhhVVpWaWtsQXJLTXJlaEJPcW1MTlBLUnhXVVpSSDJSaitVWmNvSTFjdmpLbm1qTkpMMTFFRlpobktICnc4cW1MRE03UTRmMnBpd3phczJLKzZBc3M0Q1hDc1NnSjhPZFlJdXpGMldaSzZkMEdWZW9NUUxLdVEwM1l2a1lUYUpDYnh6eGNneFkKL3VMVmY5ZUZBMi8zMHc1R0RXdUd3cHVidm0yOE1wNXdtWHJFb2l0M2R4dDd3Wlc3bWF1YnJkd2RNTjVvNVdsVXc0dXNQQjBaM0lCawoxNmtmc3ZLTWQrNEdLMDlHNHU2OXhNVGRWT1hwOHBJWFZCbEZZMVErbWFuTU42VGxRQ3BETmNKSTlVMVVEdER0QmlwRHU4VWhMVURGCjJmV3ZOMDhadG1uR3Nwb3VkUEYzQXFiTVBOSXFiNVp5ZHVYTVppbkR3SFphZ1ZLbXB0NGg4UTFESTUwYXF4aWhsTkVSWTZ4MG5lQ0sKdGU4RlVrYmhBc0d3d1ZFT1BOTEdLSmRvOUh4VGxDR2NZb2c0SU1yVUI5ZDVHTXJBSjYwWFFMbTBjQ0xOVHk3UmxEZnd5VXd3T1FHNgo2Y2xJUXlzN1pYZ3lLZ0thR2NzTTZ4WFRPbTUwTW15azhRVTV1WVRRTDhESnlFa2htdkxpSnFNVUp2cm1jbnBGcWtFWlI3OUJLRG9SCklmdUNKdGRnT1FZem1WRzlOUTR5R1hvUFpvbHZZaklTT1BTNkE1Z01DVXEzSTA5SlViZDI3b1ZMN2srUUVFMUx4bTZNakFjc0dRZG0KYU81bUpUZEwxallxdVVYUHpTQWxOODlTTDFJeVd0eEZZb0drWkdoWW1Pb3pKeG41NTZGLzM3TXBWMW1QdmlHc2ZvZEpUTUZJUmxmMQpyckQ0cnBqQXNpK0hiQXNmeXpBRmEvT1JzUmY3b2R4NFpBUmNsRUUwSFJtT0FSbnNBVWVHdms0bExSY2JHZGZhWFF0QlNDb0ZLazBCCmRRYXFJRDFnZ1BrR0k2dGlySDdiWEdScUJwem1ZZWF6QzF6eGdpTDNhQWtTVE9SZC9oNUk1RzRveG91SXpBWXFQSmFCeUtkWTJUemsKNGdMWUZ3NjVCaDR5YU1nZzlETFZHRERrVmc3b05WaklCSzF3eGFLSy9CWk56NEtFM0VLdGVvT1FZU3pFR1p1RFRQWUsxeS9HSU9PMwoySmJpeGlCWEYyTnNDaks4TkhXR2RDS1N1ZXVscGRkbUlDT0x3Ynh3SUpCQnRlRjNGZ1RrRW0zWGJ3QnkyYzM3ekQ5R2hZWkltc1lmCmsyWm1odkdtSDI4WVVjQ1B5NGlwejZrNUdBaHF2ZEhIZk8wc0RlTzhBclljNWRzQlB0Njg3NXQ3akpveTFSdTZLS2RrVDB1aUhtY2sKcEl4c3Zwb0xPVTRWekdQa1padTNVaSsvTGhibkRUek9YYXIrelR1R2dSQjk0WTV6Tk1hOGFjY2YwenlyQ3cvc3VKb01HYXpqeGdGVgpOWDRiZGN6V0NtSEVYSWo1Z1VXdVFUckdPNTJOSzk2ZzQ0Wkt0NmVlc2tJTW00T2ZrREhIaUM0OTVpTnZ5dkZpTWpSOTI1RGo2azdlCm0zRThWQUw2Umh4L1RKakxnamNoanBPbjVTQWNXMmY2NGh0UExxTnN4TFFsR1o0b3lNeVNUWUo5bmJTTGRURmdJbWxKVVUyNDhmUkMKTHVER0VTZC9vNDJsK3pwazR4R3RDZ3cyenRIaTlzVTE3cXF5T0ZoakN4TTMxWmhKQUpVcEhxZ3hreDVSbFlqRnI2R2ptMmlNdHlJWgo5TENCeGlnSlcrWTZrR2VNOTlrTEVYMGxIUHUwcHRrMDQyS3ZLV0RHT1h5QVlCbXpSdDBqYnFDTVVlL1dWVzFKVHdtTEdyNlNtMk9NCmdqT2psQytNc1NYZFFURnVEQktrQXpIbXFvcGxxamZFV0FxU1VRN0VHQkhVajNWYVB4Ump5am1mc0lUc2lWclIySTQxQkxEVTZuSXgKUHJpdi92ZjM5TzR4K281WVNKdGlYS2NiVGdiRU9GaGxtMkhjY2tocEw0UXhBZ2pGMUVsNjFjQmRVTTBUQUdNU09Lb05JWlVIOGtKTgpndXRtWUFpcUd2VGlscDNKdTlqRkxiUUZSaGNqM1VxOVo1Q0xrYU9VQnZ3Q0Y3ZG1mSTlqNTFDTDBzTXhrUmo5aHlPeEY5amltU0s1CkxCc1JzWFVjYVBGS0NpQzhtTVV3c21vaWtNVXIrbmNFc1JnZ1YyK3dYZlNWUEtjR3JoakZXQXJlZVN2OEE5TnhONng0VHJkRURsYngKcHZNR2doaG9DcnFYTjZsNFBQWm93Z2loTUhOeHdTbmVoaHRUSE1aTktSNmV3VGQ5R0NKZXJuNXZTREhFdHdyazJEaVQ0YVJDRko4LwpMMEp4R0RlZ21IRGxWUStmZUFSVzVNWVRRNHdzTXBEcHhLTTVZeDEwWWhpbWVickhLNDFlMzhFbUhxRk9DaER4YU01aDNtUmljS2NDCmFZelhld2IyUDdqRStHdzJlamV3eExQWm1RNHNNUTNsd2hJemZwM2VVT0laSkNjemlhZmJnUVdTT0ZxSDMwQmljQmlWblRhUEdKcE0KSmhxTkk0YjZrdmZ3cGhGdllGYkFpSWxjWkRyTUxPTHBEL1dGSWthcFVqSWhORXJuMU1RMFNNUXdaRWZQTjRpWVJzeEV3U0VHMDRrSwpFbU9JVjdFRGVGT0kxOTBXRVI0TFVjOGpIUWd4Uys3eUcwRU1QQmREWEVFZ1J2cGVsUm9HRUVlejlSZC9lQVpITmZERHk4dXFUUjltCmxTQnh4QWMrYk5iMFJnL2poRlkvNE9GVkpObDljWWZ4dWJGWUxyRERLMHBoZ2pwOEhXWXpoMmNrWkFNNVBKMmEybnpoR0FaZXdHR28KWFVVME5tOFk1TEErTG83d3FCNUxiOXh3RC9adkdKRzFacXc3WU1QVW5NLzZaZzBqZ2ZTNDZUQkNIZmc3R1VnOEpjQncyZlFGR2taaQpLa3FuUlVOOGxIVFltR0drdUpwNzFXMHRUM2VnZTBPR2V4U1dCV040RzI3RThER2FNTndOTjlwOFd5eHBrMm0yR3pBTUtEN3h1VjZRCm9LQXAwSXYwVktxTDhsNXdZWkNqVk5SdXRqQldQQUpXR2kyTXRWQk9iN0F3VmxPcDlNTVZ4cG9yOE1QOHlxckZCQytxY0xNb1kwT0YKZ1JscTdTQ0ZSOUN0RDFFWWdpWWlKUU1vekxXWlM5dFkxa3h5YVpsdm5EQzlzZFFPVFZncjJYNWd3bHpyanZ4bUNXTlZ2SXdtNXEyRwpRUVg5UmdsWEt6TmZKR0VBcE9LOCtYMUVIbXh6aEQ4N09qOStSeWZxLzM4WTRTOTQ0RDl5NVBydDcvMmozLy8xZldBYzZBOS94Zi81CnMvL3JMMy9SRC96MGg1Ly85SC81NWYvVnNkdno3ZS85czEvKzdDOS9ZNi8vNFM5Ky9kTi8rc3RmL2Z6TDcvLzYydjZQL2NZLy9hdGYKL3ArLytPVnYvdlNmL2VGdi9yM3B4MUczOE1kKzRILzdpNDlUK3A5KytZdC84Mi8vK28veWttUFRQL3k3UC8yNFFmL2pYLzNoOS8vUgpiWC82NVYvLzlYL3l4cmpJajd2eUY3LzgrLytNYS96eEQzKzVyeEZWM1IvRDR0OTZqZi83WC96NVgvL2IzM3lXLy9DSC8rYnYvNlB5CnAvL3c5My91L2ZCM3c5OS8ray8rOFB0Lyt2R1MvZlhIZS9hNzM4bjhEMzc1TngvWGRmM0RELy9rMytGZnB2N2xIL3pWZi9qMy96YU8KODkvK2sxLys1cHYvK0piK3V4K2ViMy8vNC8vKzVkLzg4QjkrZUlHaG4yLy84OGQvL044ZnByLzVWci85NDIvL3gvLzVmUHR6YlBuUApmdmpkQktPUS8rL1gvUWZxZ3JDUS93a1cvRUZ4N2g4emYrenkwMzJjbjM3NC9jZXgvOWNmNEZ3endmVkFmNWIxSDFoK1Fwby9vTndGCkRPaGp5ZmV4OHNKL2ZJekRuUmJHNXY3bG4rR1lrTkpYMUgweGlKVSt4aG1lSmNaM2xHb2ZNNHhWMkt1SkFNTEhEOVpQeHE1MmNELy8KOERZREZmSHhDKytqb3BqbFkreDVuNEdOT3NDUU9QNjlyWU5QNzZNZTQrc01qdms2MjNQVTY3cSszSU9mZi9qWFB3Q3N0T0JrZ2lySwpmQmpVUFFWVEsybmhINjcyUkluRXgvSVhtWEFVSUMwVWNYN2MxL1I4KzhmN0VjS1BUY1FuUDM0Rk9EdTAyd3dqWk1YUUlLcHIyY2RNCjlEWW1wVDk0YVpmNUVTWGlkZFNQNldqaEpYaWRRUmgvL3UwVCs4dVBLNDUvWVAwVEpybE1rRTRjdTl4bW53V1dySk5GRkwyblQwYnIKaC9ZWjIweVFWLy8yT21yRGVxR1ViNjh6Q09QUHYzMWlQdVAvK2dMLzhSZTR6cHBOU3B1TXBIeXN1NEd3UVRGQnhidjdNUTRRQnRpZgpnZGc2NFFFWUxEUTJBSE9ITFA2blcwdEJSV3J2VTRBb2dVdWkrMlF2NDMxaGwvbmNoT3VvNTNaZFozRGYydWpmOE41MmtxdjI2YWpICitEcURZNzdPOWh6MXVxNHY5K0R2T0RiOGpxY3lRTHo3ZEY5eDJ0QnJ2SDRmRjRnby9ldE1MK045VlpmNTNJSHJxT2RlWFdkdzMxZjgKQkZ6bjk3YkladVpQcit4bGZKM0JNVjluZTQ1NlhkZVhlL0JkWGxsMjlYcmE1L0VMZ3c0cTFsN2pWMlBZcXJ6SHI4dDRqMStYK1l4Zgo1NmpYK0hYTzREVis5U3hGOW50YmxuWitQdW94M21kd21jL1pucU5lMS9YMUh2eXNvUkp6Q0pRK24yNE81cENuZkRvSXBvdktMK1FlCjNJL3hOYmdmODdtTWM5VHJnczhadkc0T1pyeUJRT0pyVy9MKzE2ZWpIdVByOFJ6ejlTajNVZStIL3VVZStPWmN6KzJlcTY5bmZPYnEKOHpaY2MvVmx2T2ZxeTN6bTZuUFVhNjQrWi9DYXE4OHp2cmZkYjhOOTFHTzh6K0F5bjdPOTNzZHpYVi92d1pjMzUzVnpybWQ4T1RMNwpiYmdkbVdOOE9UTEhmQzdqSFBXNjRITUdyNXR6bnZHOTdYNGI3cU1lNCt2eEhQUDFLTS83ZUQzMEwvZmc1ODhlU0dNZmkvYlpBd256Cnk2dG9UTEYvY2tzdzIwaVA4VFpia1BjK0trdVgxbnYrRCtNbkQrVGVkbnNWOTFHUDhYVUd4M3lkN1RucWRWMWY3c0hmZlpvOFUrL3IKdmg1SDRmcjk0MUpjWjNvWjc2dTZ6T2NPWEVjOTkrbzZnL3UrSGtmaDNuYTdGUGRSai9GMUJzZDhuZTA1Nm5WZFgrN0JkNWtteit6Nwp1clhIVjdoTzRYZ1YxOGxleHZ2Q0x2TzVDZGRSeisyNnp1Qyt0Y2RYdUxmZFhzVjkxR044bmNFeFgyZDdqbnBkMTVkNzhIZC9aYzluCmdFOW5sQzlEUVpoZm4zZEhxWW85Z21Qc2dvRjhHZ3B3cVBxTTkxREFaaGFwdmovRU1INGFDdTV0OStkOUgvVVlYdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJWjNETTE5bWVvMTdYOWVVZWZPZkZ5T3ZXbnUvMk9vWHpoVjhuZXhudkM3dk01eVpjUnoyMzZ6cUQrOWFlNy9iZWRuL2g5MUdQOFhVRwp4M3lkN1RucWRWMWY3c0gzWEl5ODd1djVhSy9mUDUvM2RhYVg4YjZxeTN6dXdIWFVjNit1TTdqdjYvbG83MjMzNTMwZjlSaGZaM0RNCjE5bWVvMTdYOWVVZWVHb0hXUWdKbkU5K3p4QSsvNVB6WklYNzI4MDZ4cGRMZHN6SFF6bEh2WHlaY3dZdnYrZnJpVGtjTXI2NDl6eHMKK2JUMjRRbG8yMnMxY1l5dmxjY3hIMGY4SFBWeTJjY1h6LzUxT2pqRmY2NVE2ei84L1orL0FxMy9LZkhYOG5lTHYvcU9mUXJDbmxncgozckEvWW94OWYvcHl0Qk9LL1RzSEMvSHVkcTNlcVh3cForN0lqUFdGMmZNQmlKVmVaNmYyeVlnMWVXMW43ckFaNi9kUnY3MlAycFQrCmY1K0JqWHZ1V0dOODJuWkk2ZjArNmpHK3p1Q1lyN005UjcydTY4czkrRzV6Qi83OTA2MmxOMUUrblFMOURyN1kxOGxleHZ2Q0x2TzUKQ2RkUnorMjZ6dUMrdGMwNjIvZTJVMEsxOTFHUDhYVUd4M3lkN1RucWRWMWY3c0YzbVR0WXRmSHB2dkswODZkWGxoZFlQcjJ5bC9HKwpxc3Q4N3NCMTFIT3Zyak80N3l0K292YithZHRwS2NQcnFNZjRPb05qdnM3MkhQVzZyaS8zNExzRnNsQVo1ZEd6ckJPT1lJdkFiZjZkClJ0dzhhZ3ptWlh3eW1oYTh3eEUyUHlvWWVSMlZnM2VhMzE1bkVNWWRqb0JvOGIxdGtScjJmZFJqdk0vZ01wK3pQVWU5cnV2clBiakMKRVUyZTczMXpPSmUyVHdmaHROblQrK2N1NDMxcWwvbGN4am5xZGNIbkRGNDNCelAvbk92VHRrVWxZZStqSHVQcjhSeno5U2ozVWUrSAovdVVlZkljVjkzNDVJbHQ1V1R6aHYxOUN1d2J2aDJYanA5ZmwzbmEvQXZkUmp6RjlmbGZIU1ZEdFJ4U25lRm5Pd2E1WDRmenNkY3Z1ClU3eHU3N1h0ZmhEM1VZOHhmWDVqZklyZjhjT1BYL3YwNFlmNWRZTjREYXQrTXZwNlA5M011RGV2bzM2S1Erb012c1FoOVNRL3hTSDEKME82akh1TjlCcGY1bk8wMW5KenIrbm9Qdm56NHI1dHpmYUxuSU9mUlhEOTNHZTlUdTh6bk1zNVJQOFVoZFFaZjRwQjZoejdGSWV2bgptM01aWDQvbm1LOUhlWWFUNjZGL3VRZmZZU0pQMGkxK3VxL1YzVHZmOTlYZDY5NzM5UmhmOS9XWXp4MDRSLzJVcU5ZWmZFbFV2MC9zClNsU1B2bGNYTVFYZzJDbmZacDlGbiszVEZIQ01yeW5nbU05Z2ZZNTZEZXZuREY1VHdOY1QrejdEd3ZhTXcrWDd0RG9JODh2anB5Zm8KNU1BeDJoUDh0RHFRMzdxRHpENnFQZHozR2RqNGFYVndiN3M5L3Z1b3gvZzZnMk8renZZYzlicXVML2ZnK3dTWjVSYS83dXR4NHEvZgpQKzcrZGFhWDhiNnF5M3p1d0hYVWM2K3VNN2p2NjNIaTcyMjN1MzhmOVJoZlozRE0xOW1lbzE3WDllVWVmSzhnc3ozajE2MDlmdngxCkNzZmp2MDcyTXQ0WGRwblBUYmlPZW03WGRRYjNyVDErL0wzdDl2anZveDdqNnd5TytUcmJjOVRydXI3Y2crOFRaTzRSaFpzajljOUQKUVpoZm56ZGpZUG5UVU1CNFdadWZod0ljQ28yRTNrZEZGTzc5R2NyMGFSZzQyKzBQK3o3ZU1iNSsrNWl2OHp6SHZLN295OVYvNXhEQgo2NmFlTC9ZNmhmTnRYeWQ3R2U4THU4em5KbHhIalp0MS9mNjVxZWRyUGR2dHIvbyszakcrZnZ1WXIvTTh4N3l1Nk12VmY4L2d3T3VPCm5nLzErdjN6U1Y5bmVobnZxN3JNNXc1Y1I0MDdkZjMrdWFQbkl6M2I3WS81UHQ0eHZuNzdtSy96UE1lOHJ1akwxZi84bngvOS9PZS8KLy8yZi9mckxuMzhicjhqbmYwYnNzK1lGYVMyazV2Z1BNR2wraFJXNE45U3pIL05Qbjh6dFk5SFRxOHpuR0w5dDNZZjRQYy90ZXdoVApYK2N5MUlKN256bmNRSnJseThrNGJIdjZyTGExNTJOaFFXTjZxRytYbWJXR05MTkYrK2NyOTYvOUJEK3pFdVVHTGdCNmxINmNlcDgrCkRkUzNmTHpxTkpQQUxDUDlRUDBrcWdwa0pMSkJQemhMbk1kZ1AwQnQybVAzanlGcCtkSlFSaVBqeHdyVXY4OWF2OWo5K2ZnUS9mc2YKYjVvdmVlMkRLdEl2bzI4TldSQnhGOWpTeDNjc04yL0ptbTM5UHFveGZMOHdubXJMUkxxbHpPUWk2cmJnZWZxazBKRlZScFRmK2FxZQpNSDQ0OXVmeTBSalo1Lzh4SHNlbWJYai9jd00rUFlBZjlXVHl3dzVpdEdmMGF2N1ZWcmFTcHJVcGxDL3JTUDQ1ZmVNeXJoWGI1dDYvCi9kWlI0OWZtbjlUMCtCK2VqNFdCZjI3dTE3R3JlNnFOV1FjQjdHcHVtMTREZzBGL2pQM0hpQzJmN0UzWnhVZkhaSmp4dDM0L1Rnek4KWVBTRTBXYWtGcDhZY0p5NnVLWWlVaHRSKzJmamFtRjhZc1BGK3h1YkxwOXY3M3QzRkJqS0JvVDJiLzcrZit6NXNORUt6ZXhuRUErSQp3RlZ2WGVOWlZML1BiTGd3LzdZSDlBQTNuUDJkZmJ4YU1kS2gyVW4zUzQxMXFXMTdhR0R2WEJqQjBXditKTmd5N01mWVArVnNNMG9DCjQ2RHhwZGFoczMzWURPTExkNzZFRHRQdkkxTm8yOXpuMVBmdTcvUDNoU1hVdHlYZmRiYUEvelhNVCt1WCtTZWJpYXlSK1dNMStzM0cKN2tmTTFoTzJvUkJkeGhUajQ5ZGY4MEFJTGdES1RmVVBZTjM5YW5NQ25rU0h3WXRnWTA3K0tqaDgyUWpJc0o3YzhnY0FhNHJ4TFkweAp2T25UWTNRaGM4REc5SGgwWUdvNURoQVBzK3RSeDdZamJnNGV4bTlld1hsMXh0TThtTEtUWGJ3NnJGV1Z1UTNQZXl6STJXYmdER3ljCmNjVWx4dU12eDQxSE9sV0FyWnUya3VlMlpCcTB6TlgzY3FvUzA4K3B0REEyRHpDRFk4RW40OHc5NzcxekdOdGEzMzd6NTMxZTZBUFMKdTZiMDUxRk14ZGJxTDRQUm1EQjZXbGdqNVczci9nUldxejR2ZHV2TVBmYlhKNlFXbmkxKzY5ci8rdms0cmUxcGdEQ2FQQVV2QUJwawpiQ3ZHRVJobjgzTm9WWGVMeHNldkNFSDhYNHhsZVdiODhsdCsvUWtnS2I1bkJYbWlYOFA4ekI3bXdXdWpjYVRmTU9ZUnhuai9VWFpaCnVzZlpqS1lETm83d3VQQ3AvT1lKK082d0VWb002dXlTK0t2Tk9SZWZCRWtZTXNhOGp6ZXNaaHViUHhaOGJUNHhTYTFHekVJbE52MVkKVmVUM3JQTDFCTTUzeFQ0akdoTFgzSjhWdTk3RWlOajhxYkFOaDQwbHZwK1AxN1Nlc1ROR1ZLNUlQWHBxZW53SVMyMnhxZWJjTDc5Lwo3dGo3Z24vOURXdjlqVnZ6TVhyOXE3amxvNGNaczhwUFlVWnJKcG5yRTNlSHpXTmtMSG4ra1Z1dXQyeXFiU2x2SlNlUlg4T2N3azFnCnRiMk1wTHZLT0hRZldQd2JiZ1lCS2ovK0VPWmNZdHVSWXR2Wi9HTk43OExYRTRneks1TEllSnpQZnBqczlWNUx2RkRObjJFQmd6S0YKZVNUOVhoRml6a2FOUlYrUDZ4OUV4ZmFZNjlyNlY1dkRKMmppSmRyWTloQ3A3K1hEMXNyK3RSYnpHOHg1blRQcnNTMGJHK2drMGd4agppZy9XbzZSL0MyT2dqeHUvVld1TGcyclErWHIrY1dHZ2J6emorckZmd3h4dUdLdWlaUHVZWDFaTTVuT0ZjV3lmc1V3UFhEQzNlQklzCkU3Y3hMbUZsVGE2d1BUR1FrTXo3NDIrZmxrZStpYTQyc1lDaDkvQ3J6ZWxKSHRXSEozNFlTN0ZuUmVLSmpSNDB3TGZ0OXF5bWNVSTYKYnRJUzRzTlllNDhmKzFqU2Yvdk5NN2g5dnZnNStORXh3SEM5ZHp3NUcvTzR2TFBmSGg5c0JZN0wxaGJ6ZTdncDJIL0ZvUE5IUEw0eAp0eU9adHNjNFJoaWY0NGUrVHYrOCtuUXFOUkd1dUs1b2R5TnppMitOMkM5TjhaT1VjZG02YjRHUDhKdUg5ZStoajBiekJYOThnZlpHCjBPOWlMMGNuOENRL2hmbXA0M29ZUHNLb05ZeHkrTDRjTmk0dmlZYjErZkt5ZUFOeUV6U0N3N2E5WjFJeFpVdzlKaEIrS3ZFQ2svUW0KTXhhQk5xNjhEMURpQVBtSjUwNmN3WSsvZlY3bkN5QSswUzl3S2VjTHVONXJyV0cvdnV6LzZtL2Y5blhjZi9IeGcvLzlmNkFmZ2llNAovQVRwcVB4cU0yTWtOc3Y1WEJoK2l1OStEQk5zNFJhL09CNnZ1OUVldWxhL2NzUjdhZE0wVXR5a3NjSklKaFYvS2NXeWNMSi9RYnlECm5uUUFYdW5KSHdJYlBNaEl1SitNTlc3eVhBcXY2SzE0dFBZaG1pVU93RmZGUm9TRS9aanJPWVB6SlgxNGFIRW5XdzczWWE0bkJxUDgKSkwrcDlrdDgxejErRHF2SlpRelBGWlRPMzN3NnNUdFYxL3FTUGFiU3VIek1qdzh0NzkvM2htbFB4YS9CN0ZrZU40ZldhdlFIZ0JtUwpMVUlzUThRLzdUKzBMS3M3cm1WanhNU2VHbGZQNXVNeWdtd1J1N01wbDNZSE52QW5tL3Z4bjNLT084QndudzVCTWY0bkk1c094WEZqCm1UTGtUc3Y0NGR2NldwTlgzOU5YbzZPMnZUdkRVSDRBK3ZweFVpc21BNzVNY2N6WVhjVE4rUGxZVVFONEdWZkZodHArVzNNY2dDdEMKais5eFRoOXJtSFZ0R0VjbHprbmZ3SGoyK2RkNFYrWlNGQVN0SWVIdzdjRkwrL2Y3dFh6OHJOSERjUHBPalRTbmphM0h3MmE4VUFkbwplOGdmNnM0dTQxbysxK0xRR1VoSkk4V1lXTUpabWVnc0VZZGx1RURHUEZNOGdPR0p0d3FPcnhONHdpdEF4OXhTWXJUSGZLd2JXLytrCjFVOURMWmxLeGMrZ3lBa0NRNzV1WDMrVnVDOVZuZjg4TmloSUFVNVRibkd1Y0VYOFF5M09kWnpIRFZ6TW5INWVYZE14anByaWpXOTEKeGxrOS9VbVhNUTdBVm1lK3J1bTVsQTJSNHoyeUl6ZEpieDZmWHMxOFhRR2ZzUTZicnhlK1o0M0UwKzNpUER3cUxEdXprTXIrcFlqcgpUaEQvWW5BaWNROUdFRnppVko4d3hWZUlTZDhmNFRDNU4zd3l4NFRHQ2Z1TlAzRlllcHlBaGRsUDNyRHVlU0E4eXc5ckhmc3I4ZzM0Clk4ZTBaem5VV0dIdlgrTXI2SzBYYjNzQzdsdzRlTXZWWTJJdXBlOERuQmhjckRySFdSTVp6Z3NqSnJWOUExTHlYUjJhQVgydTAyTWUKZXNpbEo4SVZjdnJIRUxIVkg1eEdZclNUV1BHdytabnBxSWlzeDB6UWNuRjhpQTN0NG8wamtSTkd0SnlJRXl0ZVlZeXFySnVudmVvNQorc05jZWpoTzRTdU84aWZka2VLNWwrTURYWGhqd3h4ZjEyQy90ZmhtS0xxaGtSQXgvNWFtVGRLQlp6eFpMRWgxZ0x5RDgwQnZhdHdICjRLbUhCeDNCWDlBQjkvRFFQbFk1K3dEaE8yQ0k3RzI3amdNZ2MyMDk4dHhtemlQMjBWSTlqdVp2KzUrRXV2ckYwZlNOUTZTMXg0N1MKdy9qRTlORkxPQkFmWmc3bEh2ODFKckt0eTlxdjR6ckdKKzc1TTN3QXRFR2Y4ZWFSOHZhVHpXY0VqVFV2eElNbEZnUGtVOGxJRXBzbgpDM1lvMEFIR2RpSStwb2djQjlnZmVzU1MwTW5RVXdpQXFSRkx3Z0hLZnFFMXJtUFRGZ3VYK002Nm1VSWVKMHJlKzNPNXBQMzdpbTE1CjZSNFVGRHpyVTExdy9JQ3pYeHkwTTZ3eFVueDhXbjd1NkNMZFl1RkNud3JHRGE5U0FGQm4yMVZsWm1PTUlLd3pDLzl3UFRNTzhPekoKVllNcWRpOWxSNEdxWGE3dUZKWEgyaWNlR0ZDdjhTTEVZTjNWZTZxRzEremR0eDlaKzdQMlVjTzUwT3BSTmhMci9FdDZCL0E3MitGYwpaZXpkQ1dDTGp6L3ZreW85bmxlTXk5MWtQRCtESEtmRmhoYTZWNGlBN3VQbUZ0UEZxaHdYZTFPSGFXN0xrVUxHbUxCdnB3Zm0wajIzCnNsdk5UemFIM3oyMVhJQVJoT1BoUmNLSHQ5bHRqRWtmdzBmeE5BSnozdDlvejluYlB2dkQ1UkFJSXpwaHJIQXh0VkNWdWZad01MencKak5LaTk1c0JldWJhazN0NHpwMkl1bmkyOWpyWStpL2M2VjZWaWUxWjVWa2U4Q00yakFPTVdJM0dSQTR1K2Q1MkpFM1BhTnkraC91NQo5MDg3YkFqZlh1NEZhKzduL2tBMW52VUh6YzlqS0NnUk1rRnZ6QkYrVjNPMjhjTTQrZ2x0K0t4Y1Z1YlpjZFo5Z0RialN5Z2Erc2oyCm0vdWo4YkJ4d216K05tSi9FcmM5dHpXUHlSQkE5cGdnbVdpRkVWVGZ4eTlNVEdQTmlRRVA2dUc0d0h4bVFyeTBQOWxjOGhPclZTeW0Kdy96c1lFN3ZXbTAxbjd3TzhXZ04yWEE2TVVhc0h1Tko2MmoyR1c2cElyMTlSMzA4cFA1T1lkcDZ1NmtSR1g5bThvWHBVb3VwOFR3aAp1K21rd2JjZUgwek16czNOVlR6NE55OVZBSUhmdHpEbVp4anovc0sxMUFTMTd3blhONVY5QjgrSE1HUFhlV0ljTTg3ejJkUHlUSEZHCllHK2YyNmxmZVhaQXg3RHREeU1BaWc1cFd2TEJlUXN3YzZUQlpQYmNTU1IrZklQaDhLQzliTjNSdlNlOGVZTEY0dz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJdUI5UElRSmJRK2hoMzM0Tnh1RHg1NUNkSkh0WDdEVVdRL0ZVYnNUbXNTTlFqZ3JVZHNVUGxpTjUwU1hBeHNqT1YxTmcrV001NnliVwphZ1MwN3pUL3J2dWlZbndIZUQ5dkI5ZnBPR3hiOTFRdzlhSVEwYi9kNjVUMi9vOUZMZmh0amZuc2JyeUhNRHdnR2JzanNYWU45VmkyCmN6alZhTnViOXIwcFdtVDVvRSs0T1FsQnB4OWoveDNWSVJCWXhxZEZzREdWRmNZMFkrVkdUeTBDY3ZQWmQzcHB2QVdyY2p2TlZCajgKN285SDlNRDhDbGVQcTBjWlc4cWZyd3NBOXUwNjdWaEpQUU91b3hhL1U3eDA3a1dHbzEwSTltK1p3RmxuSW80YVg4WU95ajlxa1BpYQpjcGlXeU8vWXFzeHhZZWQrbDdVWGxIWnliSXdCM3owVFphMGVnYVlXdDc5amp1WjhSVHdWR2J0ajJjQzlacDhBRUxKN2Vvc29QUkcrCjRmNVovRU1lYkd6WVl1SEVCdUF4T2JHM3ZIZmZBWXltbTFxc0x2TFB4MHFpM0Q3U2JCcEdQb3lNWHR1ZlV2UUFMZE42eExDSUs5Y0IKMEY0Z1hoZjY4RExXczU1VHhoOHQ5cmJNNm1PSkdQdlhLOXdWVThXSE1hMklBRVdTb1h5ODdqdHNUKzlZQjhCWHRGZHpVdzU4S1hJVgpkQUpacnhBeVdjOStnMklZNFA1N1JWb2o1MFVKNXZGSGJhekhHMjFuOTdiMnp6OG52M2FrV21VcXFTaVNmOGpnMm9yRHhzM3VFRDJzCmZkd1B6Mk03RFR2RmZQei94eTR0K3JLUGU2RWZhZXUrWXNBY3JVU0t1NjBZYjJPaHo3NkFFUkk1TDFaV2FrWFdPRmY0WXR2cDhPQlMKM0wzTXYxL1BBYzRhYWorWExOMmMzeXl0Zk5GUDU0bnh1WTRucmlEZEFTK0hrR0RjOFI5R0VuVFU0Mk1PYUpQaUFCeldYODRZT3Y3RQp1cWdVWi80VGN2ZzdZcHpxM2o4UyttN3I0VzFQeWp2dVMySkhLTnYydC9WZ3RvbmZ6d3BWb012ZEUyL1JJMmVTc3ExSXp1UWMzbWhlClhDTyt2b3g4Ui9LTDE3QXc3dFg4Y1lQUW4zUkZSS0dYV00xL21NdStMWFhya3ZLU1BNN20wTVNGbnN5OU9XUnNPdzFFYlVVSTVVYUoKUVkvaHRKOXNQbTRPeTNYQ2ZBSkp1WjF0VnppRFQ1UFVBai9uaSt0YXkzakwwbXc4amxLZWV3SEJsbFo4T3pJKzRkQWZ6YWw1SHUweQpaZ3dRSi9aUDg3ak5YNDBmRC9wZmVOc1dHWUZsalJyYlVLVklFL1FTUnJiVDFaYW9Zb3ZmWWxkVVhTM2NJQmtqYnNvK05TTU9zRU9CClIvbVd4M1pBaG54akdQc1ZzaXJkZWtkMG00Nmg4NFFqY3Q5KzRjbFU1SHVlS1UrSm81WTlTN2tkZ013blpzWEE0MDgyaC9CaDdLZzgKRy9SVW41anl6dG1kOVh5dU1TV3dCWEI0S3pVcFVZNmZ5aUUxWkVCRFc0WUdjbHdyYkpqM29pSWxUUjh3bnNCaGt5NkFYWU4zc21WRgpoamkzVzhNY0F0R0szNDJiK1AreDk3WHRiZHpHb3VmemZSNzlCL2EyYnB3bXBCZFlBTHNiSjIwc3lYYWR5ckZyNWNVOWJhcERrU3ViCk1VV3FKT1hFK2VQMzQ3a3pBd3dBdmk5bFN5SnA5c1VpaDhBQU13QUdnNW5Cd01WNFNHVTl5QTVyeGlRb0gzV0Vvc2N4VVpIRjJpSlYKTHJaVDJjY2xuWkR6ODFCRlpqc241L0VWbVpTM2VwbzVDTVJuQWgzS2hBV2ZsRDZPSTdNTzlDTUh6aFJIcUJvWDZDTFJsTWhIZWVVOApCUkpQeDF3L1k3c2NQdDBvZUxwUUxua0g5R0plT1pNVUFuM2tBRVhGV2dUQ1Iwc0V3eDRBcFdMaklybkI2amJhMUZ0SWhYZnR5Y1JtClhROHM1TmhVSmJKSm9aaFlvNVVGdXBnVGZDYlFtemhTTHpkRWlCak03TE1rRmtpaGFCWm9NZ2JxbkoxcjVOZndrWDNldWNaR1BIcUUKbEtNTEtiV01CZEliaTJGcVdRU1pmZi9hclRwN0doUE9VZWZZYVBWSWtVVnVZM3AxeVllRmVzcG9OK05vMHl6M3prempnaE9OalZOMAprOVk2cU9oVnk4eUoxQ0xqdVlSbGplRTRlcmRoUmpHc3h2dVRoWWtGZFNwQ3ZHcnVLQXVCNUZTV3lSWE95dzFBZXFMWmtoQWp3QVhCCnM5bnVnOEk5VGVFa2o0Y1Y3T0tqc0d5dW4yamVyNVQwbldXL0c0WWhXaE9EMFA3NGpJOWY4ekZKdUhnZnl4bkZiZ1NCd29mRk9zY2sKNFpPZ0diTUx4S2gwd05SSkRtZm9aTHpCSFVablprYkE0ZFBzVEVKZzdqY2dIMWlySXc5VllzKysrTTZKYngvV3RXMGZYN3VRdkZ1aQo4ZExXVjk1UmpmY1NiQndOdm5YcHdob1FhQmdyekh3NXhWazhmZk5oTjVXK01jRGx4WnppMEdDWVVTS2FuWXlBM2x0eGE1OE45ZlNHCnJRL1F3ZGRlR0J5V1E2cFVBUE0raWo1ZTYyY1NvSDhIRjZxd1J6aDhwOTQ1YS9FeFNNb0U0c29heGt1dk5GcWdOOEJ6aUQvQ0ZKK3IKM1B1d0RxMzNnN0NqUzZUV05PdGtuWnNJcWUyTGxmWVo3MWY4T3E5VFNtMVJhZk5jV1ozT0JVMUxlc1dROTBXT0twWTJ1TkFpZFpHVgpJdlp6K2ttUFQwejZRemdmb1FWS2NGYUoyWDJLUlROdnN5eHNGQWdDdGRjdGZFQzZqRHdvaVJ0dllSVm0yL3ZNS2tjaXNZNWNOMTBFCno2SWtzck56L0NXKzVaSDdaWkM0VzBTRnRSdTZrZVoxUVBIZU9WOUFLUXpIYzhFMFk2VUw5NXAvY0ZtdlNyRjVKSEZQUjduZFJuSnMKS3MxZVMxWWMyK29Wamx6N0tGaS9nMUVRVWQyRnJ1WFI1bUdyNTlZNzRCYUg1S0tzeDZIV2FsV2JKSThGdHpZQkFia2luRERVcmlnSgpDamQ5N0RZeDc3WkVjQUNoZmRuZHhNcDlzQ3Z1OTRhdlc4Z3NrTW9HYWdRTDlyOUk3YTltQkpkZnFxeHFnbGk5QjEvNWUwWDRzQXlqCjlYSDRXYlFoc2M2WlpKR3pqTjdIc1FqUXBzUENyQWozdzlDMHg5SFFIUEdReE1ZVjRaejFpRUJ5VUIvczNLbnZtSDErMHdzZDExdk4KeDAwaG1kM1NCR1U2Qy9YcHdVWGJBY054TzhSRzZUYWF0SmczdUc3R1NDOXlaS3FpS1ZNNEJCUXp5SmNjS0FHY2JjNmY0bkFxdTdPMAo4YzRLQkdxdmlBamg1N2V6c2hucmplRUpydDB4MEZnaDY0QStSTm80cDN0UzJIZDRDYWo4aFNrRU8rK1VzU1kzQjVRY2o4MHEvYXpiCkYyN2xLaVpCUzA5WFhyRDZIMkV0Y3U0QjN3L0RrcWxoWU02bkxSUW9obnRBandOWklNY2FHL3NNa0FVYWQydzJWZ2d4QXZLbldMRE8KM1BnS3diWmhaNG16UlRsWXlkaGJVN1lnV3hxTjlSc2V1UHJrc1NRd1Nnekd5dTV5ekNpWm1nRE8rWGpKZDUwQVNJRzh5dCtUc0VDVApGVzQ1cE9IeUVOcFU4b3g1YXhnQmgwWVpLK0FkMXN6ZnMvRDNFbEhZRytZWTM2MmhmWWxQMkh4RXArZkFEZk9yQ0pzVis4S01EY2x3Cm14VnJuc3JaTUxGNjdxZDk2alYxTkhaeCsvVE1tZHMvL1UwSXIzU2hHNGVCdEJueFhpdWRwZzdkY3Q1QWZBZzdaeDAxMVlwM2NPbWMKMGlZNmc1QmlrUHZCTFZnem9CeWxLcjZMc2VBK2xPU3JqdVF2dFVBT2hhRFhibGx0eTNtdzBpd29YWEFBWVFLODBtWVM3aE41c3B6YQphdGdZa3JENFJLZ3pXMmovbG8xVmtpVVB0MDBrTTZaUUc3c1pXS0RSR2ZkS2E1NFlicGJZTGpnN01LcjV6a0dFWGNnWnFFSVBOQjhPCjUxK1hZeFhSK0VBeVBGTW8xc2hGNms5TGlXZGhjT2NKcDdNcmUwdWdZSUtENHpHNmhrZE9UT2F0YyttSTNGOVE5QmM3SFRnVGZuNHIKUHB3RmtlWk1PaUlmVy9nY3VJZmdqT1ZrbGl0dWl3M2Z4bDdENUpiNGdpNnBraTFHSUpnSlh1L0w3ZHV3YnJkd0N6eW5KeE1kVWhOMQp3Ri9zby90S1J3NmNKaXdvS1pDVzBYcUpsdVRjRm5zRWpGV2dHRy9xVDR3eTk1ZmtWRmhoeXQ5OVU4YmZ2UEZlZUJHMGllaHlZdTZ0CmxzWjdzTEZiWHFnSDh3MGlVTXhGVnNnQWFEU1BMYXVwTSs3Wk9iQ0xJRGIybnR0NFdXTXRQUmFZdXhCb1krMmNiRThRZmd2aElEV1IKMitnY08rT1Vab09FczZXNjYxNWNuM0wvaDBWcWdieFRPS3NWQS8ya1Q5bXZobWFLY0QrVGRlcWk0YStHRmU3YUJGbytKTjhPTFRnQwpHODBrTEdRVGR6aEdJNHZNK2FxS2xteGtrZjQybnZSSENnQUxMN3pEdVE3QlJlYVhqTC9qelRKU0ZuYXJSSmdMUXpPUmpZVEFPZ2JQCkxEdXpaRUF3VnBhN2xlWGFuNW10OUpUQ3FpUmpITVRIRlhsSGtKcERWUW1hOHc2ZVNHOXRDOWZpNmJLZ0JXWUpLMTFTMm10ZUFHUjMKWVh6UlVlSWpodHdhNytzU1BibWVYenBueTZCSWVhTVEzak9HQnNQQzMrZDFZWWI0ckxTL3V3NHJLbk5BY3R3NEVyd0RJWTF1YUJYdQpEQXZBUEdmMWpQWTNMcGt3MEhzWHNhenhWNTU0enFUK1pJWjNZKzNxd2pjaEN6WWVKWkVabEk0amRzbzd1NTd5c1VQYTV6REFoOXo1CmJsYnVUNVpvbk0zODN1RUhCaDl5bHJ3dnBnVmpEVWZMeE4zNGxtamY4SHNFcmhoR1MrWWVaVy9lZXdlSzltdE9Xd1d4VG1icklLUlQKTGRqdWJkd2xMTHlSbndack9vVkcyT1lTdzZaNzZXK0lzZjBOamZ4K0VFTkFnRVM3VzhSRU8yUFE3dWN2ZithR2ZTSjhZMWpiZ0NQMgpLR2gvWTVFamdoQm9XSFJ6akw3RVFBYkRVd05uTHlNb25LVnFyQWVGUDVOd3BBbTZhaFJQWkZXd2xvM2VIczFya1I0VnQ4QndTWTdOCnhua3NqaEsyYVdHNkJwMTZpWjV3MlZUd0ZVYStaVGMvM3dNN1lMUS9SOHFjNzVGcGVvaVR5MFdUMEZmV25IK0JacjUzZGlVOGpUT1YKTWxIc2V0QStRUWMveG03SHhYdUt3bG5lWlhCWVVKK0RET0tjQWVqYmN6R3FtQmRDYzFxSmNNL1NuVzNucHBvd3prS2tmV0FnT2gxegpuNGNnRVp4cmdyWEFlRlR3eFhxdGZWOVRMbHV3R2t3M2QyMUJ0dnk1WkFOY1h4dSsvbGs0YXhRaVZTb2VBd3MwN2s2UXRpZEdSaEN1ClZYTllUaHFPYWJyaHRBU3NML2dlTG1rc3ZyN3pxbWtNOEdGWE1Qa1ZDT2p1VXdDTVVrTW92aGp1UGNrcDAwOWI0SkVEODdrY0pZYkgKQ2dzZ1k2QU51MFd2dGVadVNSMDg1TnJuUzZBWUFVYkxKMVh0cjFjQ01OTktNVEJMUGRCMWxwUis3emYzYzlCcFA0alRlQWE0S1l3RgppMEt4ZU9mcGl1NTQ3Zk1jT0w1STlwQWJObFZqTUlGa2ZZVGN6Tjd0SCs0UDI3V0tSWFBKbmRlS2d4RVNrekhReHlSUjNBSFhWKzVHCklyK2RiSUZ1TDhVK0dXWnFHdWFLOUs0RjkrcTdBL29iek01RU8rdkN2d1ZuT1NlWFlUOGhCa240MVdhY1RvdWhIMTZJMHJwbEJPR0kKeHZHaStFQzE1T1dldW1nMURCTGg1VXAzcmpoMGhHOWphT3NyY3ZVRmI4VSt6aWIxT29xMmxsTkdRRWNIVzFaN0JHSFQ0bHRWc3k2SAp1N0x1YUlHN1F5NTlVQXp0ZHVOTEhpK2Q4eW1DWFVHcGlzNWNwTUZidk1ydlpYaGU1ZXFxOE9mRGxIRVdMbjdIYnZ4Y20wM3k3c0JqCmdXem8xdmFoYVF1a3kyQ09yTUo0QlBSeXRwT0RCUmVWL3BLL3RwNC9Lc2pYd3BYM3BXRUlWUkRaN2hvZ0FqUFd3S1h6cGFYYVBtZHUKRVlTSUZPMVZsMmdRdFhYbVdtQWlHQ3NsUkhWck1OU1hJZWNRWDhKREJCbXJqMlM4WUREYjhJTktoQmdNVDI0T2NNQVlNSmM0UnR0bgp0VDI1eWllb2NOWTFCRW8rekxMMmhWajVXT0FOSGRnK0wwUDdxcUhqQ3lkd1VPNE1oZUZxR2VzTU1tSHRGY0ZlOGFFSXB5TUgxczYxCnJuMHdiR3E4ZVJFWngwRjRmUCtCUm9NSEVTM1VmbTVrZkZjaGpTTS82R2FGQmRKdEtHWk02b0JCZmZSbkU0UTZodzJnVFZ3Z0lzYWcKZXNXQnc5am1aNUF3UEk4eTNqZlFzczl5RC9iRm5JRWVRZUhQN1FET0ZmY3JrM3hvU3d0TzU2VHhxR2haVTNoUGJUamlBekQzaHp2cAo0eHNMNnd0MlN6SHpzWlFoSFFOTEtEeUsrbk9CaUNJc3M1eVhRdWJTZmlBQ3IvMFo1N0ZBWU1vSDdOeTc1MVRpVFZzaHA1WUtsNjl4Cjl0aHBPRCtoaE00SzFuVmRwRFpkNEdmYm1NZzFJK0RBRTJObERTTmdLV21zRk9leTNxeUVscVIvN00xRVVhY3cyVVR6dEpmT2VJSFoKQmdyMjFKS0gzRFltZkxTejl2ZTM4VUs5NWdPZU1vYXYzcy9NVTVGRzlza2s4U0hNS3RWZXNiZUdLWXhMVnB6anp0OXhSS2czbExCYgptNHI2ODRKTFVVVEpwN080Sll0QVJjbFVjdWxqb0lPeldtYzJya21GNkJzVEJSQUJtT05NUXNZcHhPb1RRSkd0eUFMWmRVdG5tOXdqClVJblhvS1JrQkR6bmpMMEtVS2U0ZE9sOHN0cWFnQzBDN1NOd3RZM0lPM0pndmlha3ZmVmJhVGEyaEF4ekNvZFordz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJNHhYTGI0VlRUZmw5eVlTeVh0U2prdktESzZ1OGM0UXNqWFVic1MrOGNRK2RJeGFvbkhLTWRtYjI5S25NTG0wM2E1VXJLbjNNQXp2MwpWZWFqeTdTMW8zUDlZUEpMM0kxMVJPQ042aXBKR0t2eGxramFqUmxCSmpsVlZPb1ViT1hDOGxWc25sUzV2MTZnYmRBQ0krRHJnZHE2ClhQamFBbnNGM1pIZG91Q0R1clkzV3kxUTVrSFdpM0FkUXBvZ2tyU3pJNm5jK3lhMERWRjNRTzltNDZ0MUNtV3FGd2dwWDFoVGhRMkEKY3R4MUlUeXFpSncrSnMwWmcwNjl3eUcxOFFrS1hWK1M5UnMrZkdDNmRpbjk2WmNka3pxSlVzQzVHenA0K0dHaG1EclJBY0RDRzFISQpZWHZncW1mZXI1bmtWaUFBa0ROQ09JbGlnZXdZMWRhV3p3aGtFYlpYd2JkYWd0NlRPWE1nQUhQRG94RHVmbUJacGtvSEFncldPL24rCmxvNlBkR1RwNStxNW5reG9xTVBWVTdyOTUyQWg4eUdwYXJhKzhMbWtjQnUyR3o0bDNPY3pyY3VWQjdEUWZlMTduM3FzMmtaWUlWRFoKNkRNcmQ0eFBjY1hDSDg5amZNa1Y4eGFiekNzY2ZCMHF6RmN0RmRlWFB1eFArS3RxbUF0TDhtQlRrSjhGY3U4TjV5UFRYbUNReW00cgpHNS8yUmR0SW1pTUhscEkzVUhkdXdJeG1pYzlJNXBSK0JFcldwRlVZVXVQRnNmYVplYlNKNW85MFNoQ1d6SVNiS0ltUG0wU3dZSjFQCjV0WUJnNWZKQkV2TjFLVzEwb1p2MHVNNVBhclBWKzIwdlczQWROSDFHTmJqY29laEVJWjc0QzZwWWJDTVR5eVhzLzFDWjlGSlVSVCsKVnA3TGoySkw4NDI0M01iMnVMS09Cem1lRi9pa21QTjFYZ1Jyemh2SmpuMmQrN0IzWktLMUZ1RmR2OEx2YU40d28xR1J5L2lvNkt6QgpKdkZpeU9XZnNzQ2N4U09wZ1ZRZmJ6RjZrVWNYNzQ4Y09KdytpUGQxdWtmSjdsRE52akVqdkJQTW5WMHNXc0hCTTdyaEwzRUdzNHd6CkpDUE03NGJLYjVKR2VGMUgrL1JRQmswbG5HK1M4MndZNFNNWXRKVjhqQ0FzVGZLSFc2S2t0ZXJhS2VPc05VYmF5NWRPNHRpNVpWTHIKV2JZTU5LeVpFWmpYcHQwT1Rlb3ZQbXViamF4dXI5eEtOa0dDdXNCTUNUZHh0UlVUUnc2Y3kzeGl2aGh0WTAwY1pRbGZVaGFLWjJ4MApxZHhFcDMxSzcxdW51OXVaNEFYcW9ueE1jTmRwdTh4cy9aQmhGMXZWWERRWEV4WUV2SlB1VFJBVXNzRDFNejhHOW9pRVY5cUQzOWdkCkdoQ1lDWC91WVhNTFhYL1A0elhBbC8yRkMyclEzdmxoQ3NwUzZHYTc0TGJZZGE5dHVnbEdtOHZDSDZCenpubVFSRVorVHErRWFSTzAKOFhZTmUwYktaSlNKa1NKV0NDK21idkNtUUZZK01NMkRadXNTQjR3QU1DUWJwY1hMQ0RJdlkwbFMySTZsTmlUYmtwRVduRlBDeXowWApRNWNwbTREYnpUaGVjVkNTZzI1MGRLY2NTa3QvK0JMYUpTRlJVVXBrWjU3S1VPVk8vVEdQRTNBb20rVEVpZFBDVGRtTVpLUGt5V1ZOCjE1bTJkeGpkZ05uOUtBUFJ6WjJsK0J5TEZrOEFpdXVuVms5Qm9HWlhxbklPL2N3RUJuZ0RYMmFpaEsycDA2S3pMSElyQ1plMUtzdDgKWWhSdGc0SXNnaXlLWUVoZHh0Y3M5eWx4dFUzMFo0RjhGZFVkWlN5Q1BOcm5OQWV5Wm5sa05jdGRMQkVCL2VHVGsySHdpYVZRSWJFTQpweFF4L3VvTUF2M0IxU2U4eU5tSGlTY0xsazFRTkZpR09JWXlLNkpvQk1xelpJRmFlMCtadit5RW1XRWttMmdwbTJMSWJPTXo1cnA0ClF3UjZ0ZHhaY3pPMEh2aTAwNFl2MldJYW5jemJocHdYRllBcVJMYTRTNXM1SHQ1OWVzU1FyeWZ4dVV1MFRlVmhnWm5rSUNCUldQRUUKd09DbUNxb09ndjJ4anpYdFBMSFhhQzFXbDNNRGdWNWtCTmJtd2tjZEI4TU1wUkZpTGtwM1ZzaEZISnRUOERrSXdkNmFXTGd6VXg0dQp3bW1iaHF4T09Zc1NyK21RRXNBSVFrTEozSXJZWFBpNFJEdzE1dHlCTkFuV3ZUeDBJSUJaelVDa0tXc1UybDNkeFpKZUxaTSt2UStWCjVXVkFKMnZYMmNJYmxKMUZHMU14OGRLa2JkcldsLzd5cnJaSE9nZFVYckYwbHhrcGxSTjNsT09yRVNpOVBvRm5sU01IOXJ1QmRyZHMKRWViRkk0c21BSEllRWxSKzJOMmFvNEJXdnF6aHNsbkJDNG50d1FBTWpwSW9KWnVNWEIwc3MvTTAwcjRveFlNRmh2eWxSSXRGZ0ZZWgp2Nk1uWEoram9aMVRZYksrRDdSQmFPWXpWNGVXQk0vQjNOMGZBeUEvRWVEeVhuTjk2YlUvc2gwNm9KOXFMdmxkNnFORVlpbElZSi8xCm5KTUtwdDR2UEk3QXUyOXlIMHVjcHo0bFJGUldScm82WjNqQkFmREdWUm5OaThLa1hrK3pkNWNRcVRmc2NUSXRHaFJtUU1oN2hYd3gKcktjSVRocVorbXhpSVNJRmdHeUlOWGJ6WXdSaEsrS1luRnpGeHFQY09wc3dvWnBQOTA5UG4xc0V5c2R6NHc1bHpRdDViR1ppZDIrTwpoaWpXVVh6TUFlYXY4MWRUcEJKY256SWhxZGh5ZzhBUURPR2pWQkJCTURlNnpSVGJ5dmtjeXlsdXFBTitaQVdibVhMalUxR0YzUUN6CjdSVXNYM25ud3J4OFJ2aStzcEtSWjFIb1lwSTVkcG1RY05pTFRBeVU5bFlpbnlZb056NWJGRTZ1akRQTm9VR2VsUlFPZE1mc3R6NWsKcitBc21GRjRoTC9YbnhmK0htWXdNQ05RcC83TW5qQ0M2QkVGdzJweFFVK3orRGxyVjBjaHJBRkVXVXVaMVFhS2NLNElrUmhGR3FsRAp1Wk10Q0N5OFI4YWR3UUNZaDRBL3pWWllCQWMzaFkvSExKVDN1cU9OS01rOU9OTWNXc1ZpRHpVcDd6TFVMdmtReldudkFHTDloZVFYCnN5c2NibmkxT1EzRVlxVm9LTGJSR0VlRThkZXFYVVNvUld2c25VWVZXOU9KZGN4d3VzeHFnU0Q0T1RiTU82SEkyR3ppWWJUOXdtd0sKYkh0M3I5RlljT0N2ZFBtSDZQcUVkOHk0b05JaTg5ZjF0RFZXSHpnRVJaWk02QXFZbmNjYnJsMk9Uc3cySVRsckFCMUxiWDJYQmNXcApGVzUrNUQ2aGl1R2NRcHlWMFZJbzJDZzNMMlYvbW5LR0JYNkxoakxyV0lxZEU2L0lRbUt1M0R1ajZVNlJ6OE9ZUlp4U0lSY1FaMHFtCnkwS2M1SVB5aEFlMityektxWTAvUVF3NVh3dmttdzUwcWNXbjB4UjhjNVd2cDlteTdzMkJ6TDg0RStYa3hRdGdmSW1kOWdhZUJibFAKMmVXenlaTVE0T1JIV1NKNElvSVU1cWJjL1JZc3FUZ1RRT0ZqMFFzWFFPNEl0eFlGUkJDeVdXWitkcHB3b1paVFY1QVAxRi93VnpuWApWNFZQNE9RT3VXVHQ5d2thL2MwcG1qdDhiNGZNZUE3b2N6VFFWUW9MVEhOT29oVTg0cVErZXdRdUJvYzJBbjRveFVzdTdZTXMzWXpnCmRhLzlGWEM2cE9qa2hyK09xMTAwZlRILzdRcWZTNXoxMkVJMWZBSlpUaElCc0pBQ2k2NHJIRGpCVldTY0Y0WHZpaGNxem1mcER2UUkKZEJsZzNMTnRYazRhbndEVk9TUlFKQ3UrVWxpd25FWWxKRXhPUGg4Z1dETUZWZ2tycEw5eEdsSVRJVEF0L0pwaEpiSUlJYVdaVjhJSwoxRmo1cWgyY0U1UURxcHdUUmxORU9TTlF2RzdKdEdoaDRRWS8rNDBMWVUrbGJwbjVJUlRldmg1eXJTQ0N6TThCdTMvVDVzWEpta1RtCkpRU0FDNTlvMWFXcktVU2M1MVZuRFBUWk5LbFRYRDljZGN5ZERST0JCVjlMejl6UkZZRDhva2h1azEwd2duQi96eWtnQUl1U1VMa1kKcWdJOXJueTFOZHlKS1pJb01RM2QySEJsQmFmbzVFd1NtQWZjTUsvOVUxdEZlT1lxOTJrWXB0T0wvMlB2YkUvVURwM2lHaVN5d2czeQpmQWJZOElrbUJ1YXpnRjZaazlFTmJBNnZHTXVPUzIrcTFlT3prOHZnM09MNm5yNm9xQXJKS3p6T0NRSmM2bms2S2ZLVllweEdqakswCjFQSUZaT1VQb0J4NWt6VmNBalE4RmFjc0pCUnJBWFNBOWhja25VaWtvdjd1c2JzMGhEaDk3bXE2VWVZUkpEeWJwZFBsaEErMnhUdVAKR2RlZjZEN1RsZHBKUUFLTFRLTThZa1hCYm5GMmVDQlFlL3UxTXczSXlENUhPZEVQcHVwek5wbzg5UmZldFQzTjF2bXM1RjB6bkFpVwp3TjVqVlBnekdDZlFEdFpqQXZJWmxqYWpDSUdjYnN5N2dVUkFPczRCWk0yZnZ0OUwzSnllT21PZU05aUg2ZWFhVWFYQk51dkNSeENvCnh1SnkvQkV0dkdsUzhCbVhuN0h6MFQ3elQzalN2NmpHbmg4NjR2cUQ2N0lqcWpUZUlzT3pKQ1FlZENlT21mU0haOW9tN2xnc2VVY3YKOWZmSTNEVVpCRXAyNFpJZVVGOTh5V0xtSFltUWZvVURCOGFCbkpwbnhwV1FNMmU0RHVsZ0tkWGp1UWZQU0VVc295ZllDbmF4VCtNNAo4bSt3VGVTTzREZlkwb0szWE9tQ3BNZHlSMUNpZFFmVUxLYkkyblhBQ0xSUDJzSzN0RXg0R3BMdllNeEtYc0hQc2sya1B1Qm4yYlJYCk1WS2ZVQlBBSVJrWDU2ZENvRTlBUkM2S21YaTV3ZFRlR0ozWUhCRHNjM2R4Vm5vQyt1eE1ibnJPVDNNUVV2aWxMbUNjRVBpVUFESFEKNXpOZ1BXRzZYMGZoNWFLeHZHejhjQkZmR1VhdzVyeHVRWkhtQ0V6MG9mbnNWeG1JbUphckh4SW9zQjBvRFJkZFFyNy9HWG5oN01LYgp5dnQwN3NEK1lqMWZMcE9adjdxUk5WekVrc3lpYS9uQlhJSFZNMVpPcFl0N3dLYUt4QVBkdmFDcDlxUG5aOXlwT0xjaHMrSGxKZW5CCkNiK2NGTXJ5YXhiemt5R3l1eVAzQVpzSWpFdldaNzlUTTdOYlIvNXB6cEE2bFk3Ri9EUW5CemI0WFZWbTNpU1grU3VuOHpsWkdNNlYKeFR1NHpDUEZrNU41VEhlQTN5Y2lOWXdQc2tiNHQyUHp3ajgyNHRPZ0U5Z1hkdStTRUpCbk5SK0ZreXpLZEJFZUg1aHFMVHhoTzFIYwpkOE1uMTZVem5lK0dUMnFnWE5aT0JHWWgzWWd4ODdyQkRZYUUxM1NUYUVtRG1UOHArL2VXTXA5NHlyOEdONFUxdkFMRjkwZHc1WXZ3CjhpZm5PblZKc3Z6empab2xxUmFDVTM4WTVWOEZkamxCcC9HeUNFeHNXaVA3QTZwKzV3NmNwUDZwME55L1laZjdqSytjMUIweGUxSkMKdXRMNVBRN1puL2o1QXhFbmx1ZUhnS1k3eGoyV0RjbUdaSm53VzZ4Q2VEZVQyN2c1RFVBUkxJWjgzUnZUc0hDZ1dlS3lEU0lDeFc4bwpKb2tJdC9qVGNJT04zL1FVM2lRVll2dW0raFUyR1JPaXgvaE5XN3h6WDdEN2g1MXRWSlNOLzduMk1CL1BRUWxOZUl2SWZEUWxSNTRnCnNQQldlbmNVbTJxZlpYWnExN2RpNitJNVF3VjcwQ2djNzhpQjB4RGVKMU8rM3loOVVBajNkd290TjZkdDFLamQ2WXgvMnhkVHhiR0cKRVI2ZVFMRGdrNzcwcjM5TUkyRzVhYUlRQXUySk1UNjd0YlladFRucG5uZXhrU0ovTkJQRmtYL2pMbWliZEgyQW4vZ0tGOWpDeFExTQovNXNHejdUZ21HS0tjN2VvMDR5QkUzaDV6eXA4dm1wbjVqOTM0RlJ6bUFiN25URzRVZm43SjRYbTRFWmp2SldlRFZCWU5IaDkrYlhBCndsc0JkY2hyUE5VQjFrdVR5TjFDRjRiT0hUZzhSb3ZCcHh6L0VSNEpwY2pnbzlrNGp1Z3grYUoyOTlQYXl4L0hQczE3WUY0ajhPVGIKZnUvNW9OTWJkWHF2Nm5VTHBuZm40eC8ydnIzQVgwUmlmenIrNGZHalRoZlE3TjN6SDJ0ZjdOMTcrZlRvMjM2N3hJK0huZGFvMCs4MQpCKzhXL1hDL2R2Zlg4MjRQZnFwRHR3YWQwOHRST2Z5MDl2bmV2UWVEUVhPaVJPdDFwOXNlbEQzOFhkYnVQZW1Od20vNHoramRSWW0vCjNRVk41TTZudFh2Zjl6b3RBQjhEM3Q2cjhhSnZtOTFMVy9hWFRudjBlbkhoWHZPY3lrSlhYT25QMTVtaTEyWG4xZXRSWlpLNCtJM1QKMUQvOXVXeU45dnVYdlRiMGI3Ly9hMVVDejJpK1FkSFJzREtWWTNWdW5OUUhUMDRlZEM5ZU4wOUVWUm83YlNpNWhDWXNjK09rVkorSAo3eW9QenJ1MXBtUEp2SXpvK0pYL0x1N3V1b2pKMGVYZzlMSmI5bHBsVlZiWXFoVzV3ZTNjOU1EQ0VhOHFQYWZOWWZsb1VQN25FcGhRCmZicE8xTHB4Q21WVjhucVg1ODlhbytiYnNycWNqS3ZjT0dHOS92R29NMm90Mlk0RGZVTXEvVjJudXdLQlkzVnVuRUpjY2xXcEc1VEQKeTI3MWZaeUxWNUZBYzdvdUZuUjk5bTRVYmNybGR4WEZTZWp6QXZhdjhiaDBla3NXWUx4Rlk5a2JuMldkWGxWYStoZmxvRG5xRHlvVApGQ3JjT0ZYSC9jdEJxM3c4YUY2ODdyU3FEOVlLWTNXTGkrZWdmMzdSSDNaR0s2eWQ2K2dIYWNsVnUzRHZzRHlyM2Q4ZEFkZVBvdDBSCmNBYVZhM0lFVkxzajRBeENka2ZBV3hHVFo0TW1hUHZkYi91ZDRaWWRBaXRiV2piekRGaFppdXpPZ0xzejRPNE11QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJT3dQdXpvQzdNK0RIZGdaVVczY0dYSUdpVFRrRHdzRm92M3hiZG85Zk45djlYN2JBUTFhWDIzSkFXb1dTclQwaVZkYTBoNlAyWWZtMgowOFFPcmFDS3hwVnVmSVJQdTVkTFJQMEgwRVZ2UlVjZ1k4dTJhUWlQbTVmRFlhZloyMTg2Yk91b1lGZGVTZTNxWXJHOTFvZnZkbldwCjJQNzFGZ2pwbjUwTnk5SHkyYlI1UW1BVndiWXBxLzhaamRibXJmc3VhcFlZWGRqcWQvdURMMzU1dmZTSUUyK3E3N3JWclkydTlJM1AKdHNvQko4UEx3Vm16VlI2M21xdFFOVmJweG9rYlhwU3RaNWRMNXQxT1FveEppQnYzRFZhZWdEQ1lsOTNtNE9HdkYvMWUyYXMrVHRNVgpiNTdLVllrODZQZUdvK1lWaUF3Vk4rbWtBc2MxK0U5Vkp2MVdtU3UvM2NiUlU2eEN5NW9mby9VS3BIendjL1MxcUNMUCs1M2U2R2dWCkE5UDEyQ3JMWTdkaWo1eU9zWG5hMFpXT3F6dnZ3MjE0SDdaVUUxcVJyRTA1TGwzQm5iSXVNcUh5YnZGbWlVNFVqUVVXdmZrNGpNcUUKTExHcHhJU29kZFk5MzZUVkNVblhtcERxZTh5YjI5aGlWcFphNjc1bk5nZWQwZXZ6Y2xUZHNiMUplMmUzTTNyZTdDdzdpMjNlNXJtTApTS2k0aFc3T09YcDFxL2ltak9mVGN2Q3FSRTV1bmtxMHF2elk0aUc1dm43c0FvOCtqSTRsZG9GSDZ4OTQ5SEZkUGpubzk3djdnN0w4CnJiTHJiWDBEckZhWWpPdHVHYTVNeU5iR1Y3VTczV1oxZi9BbUhYa3EyM00zNjZ4enZaRlY2enBHSkEwckVuSWJRbEUwS3FlRkdEVGIKbmN2cVd4Y1h2ejBWdVQrNGVOM3Y5bDlWRnVicmMyelpYdWwyL1hlWTFsWVVyTGxNcTM2TGFTZlRkakx0S3ZyM3RnVHlubGIyaG15SwpFRnZoQnVPYUM3SFZMZ0t0SXNWdWFjbHZhdmp1OXVZSXFMeTdiR2FPZ01wUnlic2NBZE1FM202T2dOUHFpcyttYkV6VjVmbTY3MHlWCngyWlRkcVpOenRxd0pOd21FZ0tyM2JtNHBjc1dLMHl1dFE5b09hMDhOanNodHI1anMrNUdnZ2VWWFVFSHI1dTlYdGs5THJ0bGF4VWoKMjNURkd5ZnlSV1UzMFZXSm5LNTRhOXZSWVdkNDBXMjJ5dk95TjNyYXZOaThQZW04Q2FncXU1TTM0cXhVNC8vV3BqNktzWTlWcWFaUAoxZFZ4TG43emdyS3lzV3RqTnJIcW9uL2RON0hWY21sdWdDWitnRGVrbjFZUUgrc285cXJmejl6RVRDbVZyU2tiSXdlcXI1NTFsd09WCngrWWE1TUM2ckw2emxZSzd6anJkN2lyQmE5M2JVRHFXcUFlUmZSWWZwYXB1bDdXbGIvN0dTbVd4RnlqenpYOUwvYTlJNFVTdFd6RFEKOWlyUHhHYXJkWGwrdVR4S0lpWXZxbkx6VnZYS3M3SmRQVW1UTFh2anRBeEtPbWhWSHFwMnV6UHF2RjFob0h5RjliM25kamJvbjFlWApoRlI0ZlQwNW8zNzFrMlQvRmdocGRuOXB2cXU4Z0VBMUdqVUhLNmxTdHZ3dDNHN3JsYzNLMTRWYXpXN3JhYi82bFkrb3dpMmRUSnE5Cnp2a0tFdnFhN3Foc2R2cTdlcjR0WVRPdFhkak11aDZGcWcvTnBwaEVkbUV6OHpidzJ3cWIyZmIzRmF0blU5c0Z6c3l5MDkxbTRFeHIKNndKblZwRG82NzQzN1FKbjFtaC9xcXlOYmtiZ3pBcVRhKzBEWjFwYkZ6aXpSVUpzRnppekM1elpCYzdzQW1ldUdEZ2pQcGJBbWRiVwpCYzZzSVByWGZSUGJCYzZzazlqYjZzQ1oxdFlGenF5d2V0WmREdHhtNE13bXVJZzJKL3huaGFGY2RWTGUwbEJ1Y0xMQ0ZRTFNkb094CnVYazlObWNzcnE4ZnQ5dUhyVWtaK2VESnlTR2xDanBaemI2MFpVR3MyNXN1NldieVJLL3I1ZHVQSVQzUFRyNVZrbTltSjk5MjhtMUQKNUZ2bHVicVRienY1OW5BQWdJOWJmU3VSQlR2cHRpSFNiYWU5N2FUYml0THRvMWJlZHRKdGs2VGJUbmZiU2JmSzBpMTJHNTJzNWh6ZgpNaUZYbWZnUDRvdmVLQy9oYmhHdHNJaXlqM2tSVlNaK3Q0aDJpeWkrNTUzVWRPVkFRRXYyaXhWaUFhTWFONjZPZlZ5dmJUM3YvRnAyCm4zZWI3MDVXdTQrNVpYSndVSjczbDZXTDJPV2t3WTdjVms2YWlrSmtsNUJtTVhtM21aQkdWSitUdTR3MHQ1aVJabHR6bnd3dk1QdEoKVmJyZUsvZkpEVlBXNmJYTHMwNXY2ZnZYOGFoZGxNM1I0UXJMTEtweDg1S2pKdTdMcENZMC9KdlU0UC8zNFRQOHZROC8xSzc5UHNxdApIRnRXVG1TekxxclV6UjRwYnpwZWRvVzMxamZsbHNBV1BwYTV5akI5cEJjR05zTnpzKzRYNEpjdGhNMTBzN1g2NXhmOUlXZ1R6eTZYCnlLL05rM1lyaVlZTmliTS80UEhhUExsUTJZajRab2w5S2hvTExIcno5cGJLaEN4eFhNV0VxTnZRdFNzVHNpUXNKeVlrWFd0Q3F1OHkKYjI1ams3bVNncmJ1TzJkejBCbTlQaTlIMWJXQlRkMUJ0eTRINVZYVWc0OXhLOTBjOThlVnB1dW1ET251RnVMTy83enpQeThpZEMzOAp6NnZsWE56NW4zZis1NTMvK2NPVHVmTS9VOUdkLzNubmYvN2dkTjNnMnhzNy8vT0hWemZSQXkyVCt5dXBuanVmODg3bi9MN0U3WHpPClZ6TTNyUEV3N1h6T2ErVUFhSGZPemk2SDVVRy9CNnBCci9yeW1hcDM0NVB1WGRudDluK3BTbWUzOCtyMUNINnZ0ekFKYVdVeUo2dmQKL1BaYldieGZEczVBS1Q1ZTdTR0FzVXJyNjZheXdubzEyc2JxM0RocGJuMXMyK1oxclNFRTZ6MUVXL3dzOGM0RXQrNG11RlcycjUwZApibzN0Y0x1WGlYZDJ1SjBkYm1lSHUrSng1LzZyUVZuMjdvTWFWdDRIaWp1dit2ZmZkdnJkY25SL1VMYnY5d2ZOM2pJLys4NUFkOU01CmJpcGJUTXN1ZkZuSlBCZlZ1UG10TEs5TVdQTzN6dm5sYU1tTGxySGc1L0szWnYwNTdKQlo0d2pWcmx1T25UbTB4NVFqcHdGdTNnSUEKeWJUdFZocXgxV2FhNFVYWkFvVjVzTHNTc2RiMmpCVW1vUnZRaDc5ZXdGbHJCYXZ2ZE1WYmlHUllsY3FWYmR2VEZYZkduSjB4WjJmTQoyUmx6ZHNhY25URm5aOHpaR1hNK0FIMW91ckhHSEdmWkladk96cGl6M21mWm5USG5mWXc1dDZGbmJWdGMwaHBacG83ZE9XbHpUVk5iCmViMTRPeE56YkxFUjZncWtiY29GMUExT3oxRTloOEl1UGNlNkViTG02VG1xRTdMbTZUbFdEYUZiKzcxenUxTnpkRHVqNTgzT01rdjQKNW0yZ04vTTJ6bTRMdlQ0NXQ5dEMxMDJwV2ZNdGRHc3lYRjFKK2Q5dG8rdXdqVzVkZHF0VjlZT1BjUXZkbkVDQWxhZnBwZ3puTHF2Vgo5bVcxK3JoU1B4Mi9icmI3djN6Yzd3NVZUbnExUzF5d0h0ckJUU1F1dUtVZFpiTXYrMWQrRHJSZCtUVmFLbnJqTTZ3NklVdTJoNWlRClgyK0JrUDdaMmJBYzRXd2FsTzJWVnN5bUNJTnR6Q1gvakVidG96b2pYSDJpYnNxZ1h1R3dzQzZEczlWbTdkMGhidnNPY1VJbGQ2ck8KMDE4NjdSV0N5RnpwbXpjenA5VXBlbDJ1RXBQbGk5Kzhjdkl4SHJXdkljWHlEZE5TRjdyeVZLeXU1OStHbXI4S0pkVVYvVjgzeS94aApkdWFQelRyeDdNd2YvZlZVay9OdE1YOVVKMlJuL3RpWlAzYm1qNTM1WTJmKytJakdaV2YrV0hQengwZDJzQjQxVjRqdjJrWVA5dG1nCjJSbzF1OS8yTzlWRDRHM2xpbVBNTGQxMHRHdWpjaWFaMCthd2ZEUW8vM05aOWxyVnRldUpXamR2MWFzY3o5dTdQSDhHWS94MmhhdlYKY1pVYnA2elhQeDUxUnEwbGh0WFl1SUNsdit0MFZ5QndyTTZOVTlpcWJNbmJsTE5FNi9vQzlOWjJiSGJKdERjby85SUtRbjZYcm1neAplYmVacm1pWHJXaUZnYnE5YkVVcmFGOW5nLzU1ZGVGQmhXK0JuTW92VkkzNjFUWGovaTJRc3NzalJadjhMby9VL0R4U3QySk5Xam1iCjByVllrcjY3SEp4ZWRrRkYyRmhUNHk0UHpBWmN2bHZoakxFaHB1QXIzRTdibVdFWFduZTJMZ3B0QllwMlVXZ3pxTHgxWTNuWUhFK1cKWEt6ZmdFaTA2cE54dmVQUXF0T3h0VkZvbzRwSzI2WTVNSkl0OTJCVURoWGFPVENtQ2J4ZEJ3WXV1V3QzWWR5U0tyczdBKzdPZ0d1MgpoSGFud0pYNnNUc0Y3azZCTjBqVFIzc0tyS3lmN2s2QmEwUEgxcDRDdHplUXJYSkdpYzA4QmxZbWIzY00zQjBEZDhmQTNURndLUzI3ClkrRHVHTGhWeDBDOWRjZkFGU2phSFFOblVIbnJ4OEFmKy8zMnEwR3p1bEJlMnpOZ1hXekxLWEFWU3JiMkhGajVPTEhMU2JFZVYwZHUKNW9yc0dnL1VwcnphdDlrWk5uWUpSaGNSc3N1d2NldFNZTTBsV3I5Q1pvM05rMmtmTEYvSVRWdTd1NkIvMTF2OWJuL3d4V20zMlhwegp2MlpCL1l0bXF6TjY5OFVLWnVQaDZGMjN1aG5jbGI3NW1HbWtkZHNFeEVwRWJjcWFlb1FUY2ZPVzFQdmswZG5aVG0vRGRycjlDc1JxCjhtSE5OWWdoWlRFOTJFYVJ0OEh2RzFaTzNPRGVTVDNvOStqeDl1cG5pOGw2Tno3eGZubTl3dVhKcm5zSXZsNWg3VVZVVGxhN2NTSXIKQitNTUx3ZG56Vlo1M0dxdW92V05WYnA1ZjhGcWduMDEyc2JxM0RocEt6NC92Q2s3MXpZZGZWZDlJWHA3ODhLWXlrbW55aTU4V2NtMApIdFc0ZWZtU1ZoYWZ6ZDg2NTVjcnVGaDkrUnNuaXJhazI4eG1kQzJxMW1HSDFJaWpWWnpDMTVRdDROREtoU08zOVcrZTdyZFRqRFpkCk1ickN5OHM3RGVJVzlwZksreVlQNk1OZkwvcTljb1ZqMW5URjlkWFN1YThybnlXbksrNjBwNTMyZEgzYTAwNTV1amJsNmRndDVjM1YKbm5aUjFodmpLZGhpTmVrS3BHMXhIUG02eUliS3F0Q2JKU1dqc2NDaU4zLzlyREloUytJTllrTFVXaE95SkxsUlRFaTYxb1JVMzJ2ZQozTVpXczZwWmRlMzN6dWFnTTNwOVhxN3dvc1FtN2FIZHp1aDVzN1Bzc0xaNUcraFdQOUd6d1Z0b2RUbTMyMExYVGFsWjh5MjBPaUZyCnZvVmVTZm5mYmFPN2JmVDI2Zm9ZZDlETk1WWHZIcFZjWTgxb1c1ZmFocjRudVM3VFlsc3pJRzE5SXR6ZFUzNmJtd0twYXBxZ3pWUG8KcnVUZTJveU5acE56TzUwM0FWWGwzQ0tiSU45RkxYSC9uZlhKUTZxU1RKK3Fpdzh1ZnVOa1A0YXF3K1d4WnBzbk9GWVhpWnNpTitqdQowdE1LQzNBZEJjZFdKMGJaNWt1QVc3d1JiM1pLa1hybGM4bTY1eFNwYjAxU2tXZGJmeWQ0bTQxeW01cU80K3F6YnYzZE1kc1pFWWhtCmZSeXY3MjRpaGZHNm55dzJSVHhzY0RTRHFQNGk5aWJxMy9GeXFuemxjRlBXMDFWa3hhWXNxYzNXd0hGa1hwNlZnMGVkd2RhWlVkWkIKaXEvTE9JK2FwOVg1c0FrMlQxbXI3UE1oMm45WXphZzVWdWYyRW9GZDlsb3ZOaytvYk4xa2EyUzFwUFp4VExmSHUrbDIrOU5OZkN6QwpiZitXQTFYb1BJU1h2YjhiTkh2RHMrcXZYYXpQN0w5aTlQM09hSEpiUmhNN1lOdW9jRi9sTUxFcHg3d050cHhRTk42RGJ2ZmFwOXZtCkhJZXV0ZzQzWmE1dWFCam9kZlRoS2s5WTNYbndSQ1FuRDN0dC81UVZnalJDVHI3dDk1NERDc3JIVkxmZy9mSlZweGYvc1BmdEJlRlEKOXFmamQrZW4vZTdlM1FmdGR1MVI4MjEvZ0VKa0w2azlnUCsvL0dYdkV2NmIxSjd0SlExVFpIQ3FiUWlWcTh6RzdEU0VTYkpjd1FlVApKVHJQNFVPZUc1bnAyc3ZtWG9qeGVma092bndESDM0RzBDODFrZFNlMXY3NVUxSnJZd3N2OXVwSlF5a2o4NkltUlNQWFN0Zk85K3JDCk5FU1JLQ2pjRUZxb1dsMnFoaTdTdklhbHBjaWhqYnJVV0RHdDFZdUdFYmt3dFlPOUFCT3lZZklrcXgzdFlkVk1GMUJWSm8wa1VRVjkKa0Zyamg3U1I1QWJRaTZ5Ukdwa1NKRFdGcUxXb0R6cHpNSWRVTjNKcHBJVkFWd2tpbE5JQmd2V1NScEZMRlpVcUdsS1pCTnVURFNscQpkVUNUNU5pK3lCdENxQlI3N3JsUUY2SUJ6UnJvdW1vVXd1aFE3R2d2YjZTSTBPS0JocElpU1VORFFnRmRjY3V0UFFBVktiYnB5MmdZCnJWd0dxb0JNWlFvWmt5NEsrSVRNWnY3QTM5eGtXV0FoRG9kT1plRHp3WjRIOFhBY0VVZ1ZORUxhQ0MycFdxb05BUklGTXdZQkVzZW0KZ000ZzB3aFBrZVRZVmlOTnRDRThSYU1vbElsQktjNjFGRkRqNE9aWlVVdEZJODBLb0QwRHBoaVRJNEQ3azBvcHNZc2VCTDB1OGxSWgpQREI1TGNzSWhHeVJCQ2pzTU1EVUVCb0hENHFtS1l3YThBZG1weWdNZ1ZRS0k0VFRRSnZNQXNaR2dnR3RQZWhYWWxJZFFDbndRbVRZClVvYWpxbXZSSElBQk5pS2xpYUdnUHlyblVraGZrU1JwRWZDRVNSZ2F3OGxMREk1S1FRZUV5RUtuY1ZvbE1Lc2l3Zz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJY0sya1F1cEFmUjE1WnFRT0RLcW5NcXd4Z2tBblBZeVpEZXNPYWhwZ2dXakl4Q1FXZ1lHeFF0NklBbm5qeWVVK3d1QkRZYTJ6bXN5aApycW1waGxFNVRDQnBZTVVBd3cwc0NLVjFEWlo1a2lvSkZUd0VhRWhTYkJmNkM0c2lqU0N3SGtWUlNJbWdYQUE2WFA0UzBjS2NTZU9PCnNBUTYyRHZiKzM2UGhGZDd6OVR1ZmxwNytlUGVuWk5ab2dxZ1Z4UldVSE9HdUVMbzFRU1c3Y2xWUkJiV3ZJclFpamtTaWEwN0o5T0MKNjg3SnlxTHJ6c21WaEJkVXU0cjR1bk15UTRCWjRNb2lqS3BOQ2pFQVRvdXhPeWRYRW1SUWJWcVVFYTdWaFJudzZ5cmk3TTdKRlFVYQpUSm9yaVRRN3ZhOGcxT3lLdW9wWWc1b3pCQnRDcnlEYVlQeFhGVzUzVHFiRkd3elhsSUM3YzNJVkVYZm5wQWZhNjkwSHZYNnZWa2hECk1zNHBlMUM5S05JQ1dDMThzRGJvZElRTW1BYnp4ZVFGU2orR3dKQVdLcVhWRDNJQVZwU1lCZUo2UjZST3dtUkpaNEZ3a1Jja05MamUKTklSNGxwRnU0SG93RFFtMWFCQnhlS1lnb2ZsSjJvNW1id0hUTEFpd2lHSVlwV2syQkdCb0JJZHVpaFVSTUhRNTFKNEZDK1NIL3N5Qwp4WFduMlJKZ2NXZW1XUk5OSGVMTDl3Q0JRK05vN0d4TWdnWFdURkZUTU9FTlNFT2xZZlZSZTFKSmU0aTQ5NkpzZG0zSU5WUUFsRTlFCitoeE9vK1dnVnh4M096YnpLcHhhSGc4NjdiK1ZGRHQ1NTBTN00xZFUrQVdjWllhakFjVkhmT2VPWDhERzJyMzlmcjg3VnZKaEQrM0wKank4N2JYdllCZnFtMFdHV3pjRW9JSUpqMThsZXdiUEFuOERzMlduR2FXci9jalRxOTA3NmIrRjRGeCttL25RSmZEdDBpMnpPQVVtTgpuNCtTMnFzOWtCaEpJbkNQeFRXWDB3YzgyZmhQSUdhay9iMXVkd3FaNUxnbjRaZk1LbWcxcTVUSkd2MkkyR3dsM1BrTGxOQXdNQUpWCk1QcDd4RzNTWnl3SnV3Wjg1dnE2UmhoQnA2WVdqdmE0MlFKT2g2NDRkaWZxT1NwVkNSQ2ZDcWg0am45Z1dtall6VUVvRzQyYmVjTEYKNFpQdFNPTElkQit3WUlZOWdCNG5FcVU0NFRDNDZSQmFwRlRZRHRFSC9GWExyT2FyZ3FKVHMzeHpUZFFKdGU5bVlvOGIxQi84eGtpdwpDWXY1d0JKd3RMZC9pbXZnK3g2ZTBOdTFWNE5tdTFQQ05Fby9wVUd0RnpqQUlycnRJbXI3ci9DY2wrQi9VS21CM2hnOE5CTUFtc3NGClNQTmNBRWRlbm84VjFETUxTdEJiOWxzVk1lNVh3UWpuZWNTSXc3Uy92L2VuNzJIR3czYWl3elNOMkhRZU04OTlxTS84RkhOK2JFeVkKbjNYSDBMSGhuQnByT3dzT3duU1kvc3R6cDdzWFRha3d6OXdNNFFrU0QyMDg1QkdSclhtRExDc1BNaFFDVFcrTTB6a09pWmdjNUhSbQpRZFRlSmdaNVBzYjlLaGlGRWRFZ3o1SGNxZ1pUUVlEdWVRTkNXdHlXa0Q0WWxPM09xSGJRSExUbkN1bHJNM3RKUStzVlJzeDlza3RGCkZuVHdrMVowQ3diUUYrTUVPUjYxVWxMNTdUZjRBcnFhKzBybkZ2cmdrYmtQaUJUYWtxaFoycjhrNnZpM3FJcEZZMlY3d0Q3V3N1dVEKKzhCWW92NDdxbGpvZ3hZQXhjL3Bid1pyRGRRTjZmNktBZ3ZEdndmRUMvaUFyQWcvMXFNNmRZc0hTeFp4MzZhK1VkL09YREhiNlhQMwp6VmhXMCtIQkllVVAxSnFodjhTak9uVW0vam11NTdBZDdFV05ISTAxaVYwQU1UcFhQUUxOcUFhYXZCRGJyQXNkTmtmbG8wN1piVStyClEzYUphV0VVTFRLVkNnWDZaZlFoeWJRQzdSYktKSEJDbmZXQjFoeXN3R3FyTGlQVm8yN3NmZ01EakpNaDR6OFpEUmdneTNScWNJRnIKYVpUMmQxVkJNMDV4bjB3YVdacEpQYjNlNFF5SDJMTWFUYkhNYmpPRy85Z1pDZHJkSHU2K3RodlVNUDVGclZyN1AyYStlcUVYN2p6dwpBKzVjdWhhMkFSRDRDcVIrbHVHR2srQjVSTTh1a2NQQkVuZUdoVGoyRitPQTAwYllXNGllYzA4ZS9sV1dQaFdvdlpJV3RhQ0xaaW1aCnlWSXl6Vkl5ZFVUbUpWR0dtbmtkTFJKSUthcWpqbUwrSytiVGFvcEFySnBKYkk1VEF2K0tMTVhtbFNNU1ZhcjRoMXc1eXFZcjdNK3MKWU9MeGdsK2twVUphSWhMYmQvZEhMcWFnanROblpTSWlmVVdrRThSa2k0aFpVSEdTS0cySjBwWW9OeUR1ejRJcFNFU2w3MGVTR1M5UQpKRlZKTW90SVN0MTBFMjY2Q1RmTjB2RDNRMDIzSko1dTJUZzhGOVBVSlBGc215Zy9TWVMwTkVoTFFtSjc3djU4d01tV3pGc3h5WndWCms4eGJNYk9Jc081S083bEV6YkhmL2ZsZ2t5dFp0bDZTT2VzbFdiWmVwa2hLN055U2RncEpPNk1TLytjRHpTdVR4WU9pSnVENUZDRmMKZm45VytZbitTK28rYWJjMG14TDM3NGViVXVPOXo4YmhNMWJGZU8remhiMG5xeXJOSEZtelBMZi9mcWk1Tk43M2FIYmJ6azh2aC9ITwpUMVlZNnozSm4vTTlKMzYwLzBNV1Yvdm5ROHdkTllmN2FnNzMxUnp1cStuKzQ5elJORk0welpyVS9mc0I1NDZhTS9QVm5KbXY1c3o4CkdiM1gxSHVyUTFxZTIzOC8yTnk1TnM1Lzd3OFUvdkNkTkFvcGhmQXVDUFNzQ0kxbmNGQzdCVVdPS0s5MnhTdkZxMkRDcXZPQWpYYVoKYzk1WGVKY1IvRWZ5UVUzVUhseFEwNnJtbFhvOFFyaElsWXoxKzFpeGQrcitIUDVtaS9YMUNha3NzbkZkTTdWellsS3BJTFYwUnRGQwpXZFcyR3RaSmpXTWVWcU9YMjR0U3FDd1MvaWR0V0p2aHRoNW9CLzJMZHYrWEdlWjlzaDBsT0lsV3NQSUx0dktUcVZPamQwaVRsL3A4CkNuTGtJWFhUVVBRaEF1WGt0VlZrN3RRWnVhaVZxKzVLTU9CZ0Q3M0xOcmFnOElpOE5kVERNQ3dBaXVtQU8wQk13TVd3ME0xRklJK0sKbXl0Y0dkOG5CbEI0QnpWU2VEUk1IRU9ZZXNZNnlUSTBRTTJjc25kUmFHZEpWcGhQUTV6ZS92NkRWdXZ5L0VWLzVHL2FRdVc0WnUzZQp0LzNSaTdMVkg3UmhuZHQ1U0hvNC9ERXBuS0ZOYW5BUnBVVmlwaGJBd1lNbmo1MWsrTzZzUHpqblhFTTBDMkdPdHZ1bjVjbURKOFVKCmRQZDQ5SzVibm9TbW83bUtMYjVzbzhpUlZ6ZzZ3eXBtZnliSlJ1WjY3cWNkam5haUMrTkJNQ0ZzbWF4aDZBY1BDR3oyb0docUJoaFcKcENHM2lPR0RtMkYrSHVaK1Bwa3dvUmtSMXBOMkhpbzMzQVhYUjhUNTVMSTQyTXVuMWc1RG1BaEd5bFFhUDVVOFRaTzhxV2F2V0RBagpyTlFYTkV1RHFQVWZKSm5walNBUFJDNjBYWWkwQVdDRUM0Yk16S3VVQWxraXlhTmF1Qk9zMnRKK2haWnlNZDZJMnhwMnEyek9LdnZUCm5FMXp4NXNmcHp5TWs2djJmRzlxYVllRjdCZi9oSENZRWlEeGZoZUV5a3pZdElTYWxHRlRjbTZKN0l1MndBVWdMMW1uWk8ra0RKb3AKbGlabFZ4Q1pESm1XZnBNYlpSVmY1M0xSbHMwVE9GYWpsRTdnbUNRU2JXS3V3S0ZLS21IUnhyVkl0SzNZMG42Rmx2Smt2SkdQVXJRdApkbTZQTGQ5d2JrTlBxY3JSaTJOU2dUNVJBNmMxc3AzclBEVUNmd2ovbjNhVTBuR09GNUZ3aStoOEwrV1ZMUHk2U3ZCNFFlVzZNNm9jCnpWZjMzRkFueTBhTE9EVFBMOTdJc3d6RC9OeWZCUDFCN3M4V2U4b2ZkYnJuRXdjZGY5aFpjTWFaOUw3aElVZWtHUHdLekVNbGcxekMKY0VadHlCeGozUnpvS0lEd0EwWERIdm1LTTBDaDRoa2R2RENFTXlseVVsT2xrZVR5WXhDS1BTV290bWprR0VJOURlRnFjN1U5NVZhSQptcmxDWk43QStBQ01PaFUyK01nMHNqU25HQ1ZvQUlPSDRRQU8vUkVKbXRBSzNBSmtnWkpRWVNjeFVEblZqVlFxT2JPcVRGRFlwN0tXClM0bEIxWVpzZGhnSW5hTXpYamVVelBTY1ZnM00zRUpyYkRWdEpLbWt3S0Nza1JsUjBPYWxSWnJrczZ2cUhCRkxNalRqRm9JMUsvVlgKYUJBR1Jsc1BZMUlBZjZHN2ozeU1VUkFoYzliY3ZhZk40UnY2NUUvOFQzcHc4aDZWN1FsRHdFRzNjM0hSd2JkbXg4Q0huU0d1RVZmNgo1VmZ3enlYOG42NUh3Y3d1ditBdk5PZGZOSWQwcCtvRU9nVlM4akhKNy9KdGgyNHh2NnU5L0JZQS8vVERYU2U3Ty8zekU4Wk5wR2h6CmZ2bDZmaGtFMlhMMmYzazBmMVNON0U3WW5UdlVsOFBtcVBrRkxDT1o3YjE4OG4vKzY3My84Ly8rZCs1Ly9oLytQdi9uLy8zZm0vbDkKVHNkM3YrOSsvNjkxbUorTGYxKzJ2dDd2UHlnV1lKdEdvWUJ5N0s4c3RnRG1oZGEzYzBLTmd1WlExQjVkL3ZiYnV4cEsxVWdidUhPQwo0dGZyQkNjdlA3TUt6R0Ewb1hzY2RYcHZXSmJlSjRRbkU2aXNNSk1vUFpmcEEyUFI5ZDlQYWhJVHNmY290UDkwU1gxNWNFRUMvaG45Cit3cEJVMm9GM2hlWlVpd2lZS1JIaE9vemdYSDFNMEl4cFY1RXdLQk8yT2o4Y1JVandJS1NjZWNFMUF5a2FsVkZBM1M5SzZzYW9NdGUKWGRuQWl5bFhWamZ3NXRCVkZZNkt2WjZwY3R3NWVVVFRoYzV6WkpPWnAzRHc5WGZRQVI0OHFUMjRIUFZyZG9GMWZpdkQ2V0hxelBYcwpkRmdPM3BidEU5RHNUMnloWWJRc3dsMmJ3dDIxQ2U2Q3hNZWJKbW1HQnhyNElIV1NtK2dEZXNRVWhrSlAvbDNwdHJYQUF4cmVUSU1QClVoWTJmQ0dDSlJnRENYL3p4RTd3WE9VVUZ5M3NMd3c0c0JwMWtxb0FPeUtZRkVyRkZXVURCaWVQY0VjQTZvQkY1V0N5SVhEZ2pzWmgKYVVhdUIwWU9IN1RLTEM3YkJZWWdMdUhiSVpEMVBGaHlRa1ZQc1VjZVFhZ0xCek40WlE4WXpyMVR6ekJPMGFoUTVYd2NaaEhqM0JVNgpianhyNUhRWkxlbzBMT1BDNVBsWXIzR3RtandtdDJpSUxNdlNDSGtNNFY0SG1PLzFHTXlObzBQdUI4cDNJUnBpN21rMHdwNGNYekdRCjdIREhBQjdoS1Y1UmRLNkMzNVVSWXh5TVlaWklCZUpYNlRSaWhFSjVvTEl4RnVxR3pvdVlYVWQ3ZEdjMXlTSzJBcVRJa25qY0l3QXoKMElNQy95SVFrZWdSZXk3NDVpUDIrVzVHL1BQRStKcUJZSWM4QmpEL3BqaEYvTU9wanZjT1kvN0ZNRGUxR3lMbmxlU21QM1FpVitQcgpCcGNiYkl4ai9KTjRqem1McGlwQU1ySlBCZXd4aERrWVlJR0ZNWXpJOU1nOUozd1hZaW5EWFkybERCTVVwSXdubXFWTUJQQlNacEpiCnlFTVpNY2V4TUFZUmpiaC81anBpZy9CM29UMy9RTVRBYmpRdWVOQnNtWTd4RkdPSVpacEhTM2dNNHZnWHdUei94bUJJWWtET1hBaGQKQ1B6elBRM3M4OVF3S05Cck1jZmZIZSttdUlTc2d3MjRNT09zaTBGRW5nWU1PdWFVaGlhVUdaTitDamE5UkdZeDUxSWdKVWtqeHFVTgpvMENGQ29oamdHTmJBSG11eFNBa3plTmwybjNiZ1dXK2g0RmxuZ29HQlRvdDN2aTdZOWtVZDVCbE9VZ0VxY2UyakJoRWxPV1JxQ1RhCmMwQXBUQjZ6TEd2SU5FdGpqbVdnSjJUeFZtZ2FPV2hyT3VDTkFZNWpBZVE1Rm9PUU1vK1hTZWVtQThOOC93TERQQTBNQ2xSYXRQRjMKeDdBcDN0QnVLK3psNkloaE1ZZ0lFeUpzM1haNUN0QWM4N0h0UWVENlVXTWN3NWJUV0FoaTEraEN1MGNjQVJ6SEFzaHpMQVloYVI0dgowKzdianBZbDl6Q3d6RlBocTNrNkhkN291MlBaRkhmc3J1RFVGc3BIa1dleGhsZUF5cGc3UFlCVW9xSUJla0VlRkR6K0h1bDNESXJVCnUxRExLV2tCcndOdzI1RnlSd2NrazhXNm5aQjg3SEtJNGEvSzNJWkRqVE1nS0hZTWlmUzZVSXNwOTNnRGdObyttT1lPc1l6Vms0aGwKRFBLa3NlYmppWGZhVWNReTFxRWlsckdpNVd1eEt1YnhNaUJpbVFjRmxrVWdTeG9qOXNSejR4SExYQThqbGpFUnZwYW5uUEZHQUdiWgpKSGZHZExlSVpRenlwTEd5NDRsbmpTamlHU3RPRWM5WXUvTFZuUHJsOGJydkVjY1lFaGdXSUpZdVJ1b3A1NFlqZm5IM0lvWXhDYjZhCnA1c1JSd0JtMkNSdnhwUzFlRms2VUZnK2JwOE5DOHlwUHhIRFdFdUtHTWFxbEsvR3lwWkh6SUNJWlI0VWVCYUJMRzJNMkZQUGpjZnIKMG5VeFhwaU9qTEF3bVhhL01BUEFMOHdKL3NUYVdlQ1o5Qnl5bExFMnc2U3p3aE1ZNXRXaXdEQ3ZPekhJYTFlTTFnTUN3d0xJTXl3RwpFVjBlTVZQdUd3OE00eDRHZmpFTkRKR0JmWVExK3U2WU5jbVhXQjBMdkdJSUU4VnFERlBObWs3Z0ZhdERnVldzTVRHRU5Tckd5ZDhECm56ekVzeW1DRUQyTWsrbmxWZ09QdUdlQlI5eDNobmhxSGM3b3UrUFJKRDlpL1N2d2lDRk1UKzdGdnFXWGxadkFJdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJcHdBRkZyR0t4QkJXb1JnbGZ3OHM4aERQb2doQzVEQk9KdGMxR2pqRS9Rb2N5b1BnSm9pbjFhR012anNPVFhJalZyZ0NoeGpDNUxDaQo0bGVjMDJVQ2gxamhDU3hpbmNqWGNUcVR4K20rQnhaNWlHZFJCTEZtV1llVDZlVldvNVhtZWhaNHhIMzNkWmhheGhtK094NU44bVB4CmxkN3I4bFVtMXVMOXdWeVdwa2IvL0lSM21OTmt0c3ZTbDBHUUxXZi9yZUN5aERGOVg0K2w4NnJ3Ly80M2ZIL2ZILzlyL0gvOGFmZWYKM1gvOGYyYk1vZi82TUxOdi9vOVgvYy9IN2hja24rQXN4OFlFdExKcnczbnpKcHdiRm5vRjk0YXRPT25nbUlDdTRPTEFtbE5PRGt2cgpWZHdjczNoblUzemh2c00rcTl3eDIvbGUwUUVDRldlNFFDYWcxWjBnVUhHR0d3U2dWM1NFVU0wcFY4Z0V0TG96aE9pYWRJY1E4Q29PCmtWbThtOC8wV1k2U0NlZ0tyaEtvT2NOWlF0QXJ1RXVvM3FURFpCeFkzV1ZDUkUwNVRRaDZGYmZKTE00dDRQSU1kOG9FZEFXSENxYWQKbkhhcEVQUktUaFdxT2VWV21ZQldkNndRWVZPdUZZSmV4Ymt5aTN2ek9UM0Q2VElPck94MndWU0owNDRYU3FCNEpkY0wxcHgydmt4QQpxN3RmTUZ2bmxBTUdTVjNkQlRPRGEvTVpQTU0xTXc2czdKekJtT2NwOXd4ZStMeUNnd2FyVGJsb3hvRlZuVFJJelpTYkJvR3JPMnBtCmNHcytZMmM0Y01hQmxWMDRHQVl6NmNTaHBMcXJ1M0V3SEdmS2tUTU9yT2pLUVZxbW5Ea0lYTjJkTTROWEM3U0thVGZQT0xDeW93ZXEKVGJ0NkNMaTZzNGVxVGJwN3hvRlZIVDVFemFUTGg0QXJPMzFtY0d2Um5qYmxESXFBSzdpRElwMDRtSFVpbFhnVmwxQ2srZ2J6emppdwpzbHNvS01QQnloUHB3bUlGMTlBTWJpMWc3TFRMS0FLdTREU0sxTjR4eGw3RmNSUXB0Mk9NdllyektPaTdZNHk5aWdOcEJyY3E2THBqCmpMMktheW5TYzhjNHU3cDdLYWl6WTJ5OWdvc3BVbkRIMkhvVk45TU1YbFZRYnNjRndSVWNVSkZpTzhiV3F6aWhJdlYxakxOWGNVUkYKR3UyNEtMaUNNMm9HdjVacnN6Rm5WM2RUUlpwc3pOWXJ1YW9pZlRWbTY1WGNWVUdGamJtNnVzdHFtay9MMWRlWW82czdzNExxR2pOMApkWWRXMEZCalpxN3UxQW82YTh6SjFSMWIwL3hacnEvR25GemQ1ZVYxMVppUnE3dTlna29hTTNKbDExZFFVbU0rcnU3K211Yk9jZ1UxCjV1UHFqckdnbk1hTVhOMDVGblRRbUpHck84aUNWaHB6Y25VbjJUUi81bk55WGphRWE0KzZ6eGRkTWx6MVJ1eGYrK2ZsWk5Mb2lVaisKNjhvY25hcEdsdEtEUEtrb0tLK3hCTW1hNGhzeTlHQ09wcEFDQnVIN01pckZyTWdpblEvQ1YwRVNROG14NkpxMHZXRUJ3RFNsZ0E3YgpKdG4vVWlta0RRNHVHaExJcUZFcG0zOWFnc0lqcmRhUW9HSVN3d2diWG9FaFFKRlBBNmhXUXBlNENYZUVlWkptaWcxSmJEVjg1b0xZCndLa1VIT0JvTCtSVzhEM01YVHI1R1NCZnJVNlk4M1FHQkJXdVJORTFkTThtQVdlM3JLQkUwYTVIb2RSRUg1ZmtnOFkzblVBYWFWcFgKb3FheVJxWXhzWUxHNTVTS2JVNnA5YnpaSzdzbkI5MytzTFJQWnp5YlRxMjE2dXNaUHErV29hRkNrd1pNRWpUVTEyeEszc0lGeE5rbgpzd3I2SDM2bGQ0SHdkaEtGNHRsa3pwU2d3LzdDTmFnRUphbXEyUXdjdGhVYmpHdkxnblpTQzU4UlgyR1RPMGN0UlMxR0hlVzg2VG1sCm5NdWhsS0JEQS81Vm1NMEQ0RG4yRC84UUdReXZoOEwxbk5xMEdmbU82Qy8rSk8yYlM3YUMvYkdlRXgzMW5EcnZmNGtxNUpZZithSmsKZDVXZnZoQTJSL3hZcWpsS1lacE12b29nWmhhVWlaak1jemNmNDM0VmpBS0UzOVRURjFtWVlzUWJtOHQ2ak45MVluaGdxMk5UM2ZJcAovUEZERWczVTJBakcvNFl5b2FJZFNvdlBqV2ZVYnRRZE41anYrM0FGWmlDV3lUaWZNSnRLVmt5bUl5eG1GeXp5eVNHYWozRy9Fa2FUCnpzd1lhWk0ydm5mNkVkbkk2VjRveUc1VUpGMDhxNUpvQytYZktFUXlsNFdvMmQvb2VRRCtCTCtrTUZZVXp6ZU9hbUZTa2l6WHNCRlYKU2twU1o0VGN3TGx2YWtaL1p2UTZGSnBDdGFDUEV1OTlpa0s5WCtJVWpmZG8zVC9xZlJKRWl0dmR6YTZmd0EzWXJ2c1gzMThzZU9OcQoxUlNZUGp0TVN0bW8wRVpEMlg5c1RsSlNwTkx3VWZxUDlhaEVQYzBibVgxcHFxNHdDMm5kUDNSbHY5ckliUHhJc2M3MEtUeVVSWlhwCi9TeEVTYzlWOGFjajN5MzdCWXJpQTFqd1pReUhRMzJ3eDgwZDdVWDlRSVhYVmNRdXhvVHlYbzhNcUtjRllUbDNuOXhUVnZReFBKeUUKeVM3OWswcVdCZlNjbFhRZkhaUHNBMHlXak1TeGlDcFNQY1Nacy9MaG1zV3UrQjc0RXZoMkV1WFh0QThxTVRNU3o2T0VSeWg4c3QzdwpuVHVLaGpheFRCVCtqUzFQSFhhRnlUN2dqbnlZbDdaeS80d0Q3dEpDNWcwOTc2MnRtVVZudjdZMUYrdjBlMXV6aTg1NmNTdFNPMkttCm5jZmNqSGdjR0I4R0l4cWp3R3RtTlE4cEQzbVlhQk1qRVk5UjFKSDNWeTd3RGF1SkhWNFdsblZqNzJKaCtubDZoR05tWWRqaHAvSWQKTDhTOFh4WHorQnRaWVltZDcwMnN2WWwxNmFkdTNjL2R5WFVXcjBBM1hBZlJhbzJXY0QwYTdqa01GKy94REpreU14Z3U3TXVvY3dwTApkSjR1ZjQ0c1lONnZpbm1jNGUrbHpOSENxbU82YnpmQU9LK0ZuYjBTbjRiTEdYcm04MzA3bnVGLzNYdENNa0tvL09qUFhIWDBlL2hrCmZ6NExJMG12cFBwcVlteWtKOGY4Ykg2QzdTSlRwZ2FuRkdDSTJ1WmNjODlCd3h3dFZpaXV6N1NHWXFHUmFIeWMrWHpQcGpjeEF0OHQKQnJtUUpvSk9YRm1DRDdQaTYyRDhtUjZ0TnlZTGtDTVBRYU1wZWxnaUNLcmVNSWt4elM2KzMwdHZkS09keDAwVFkrM2RCenh0UUd2SQpETnFPOGtaU2FHdVhLMHhtRFc1VVpBckFPSTVzTXQreFZ1cVQvYWhQZHZWZ3J6NU5UejBtMkZyL3hobFNqOWxWanpuWnN1L1V3VWxECjB4RVluNWZUalRSVHRYL1lsK3B5KzNxeXg0bFpPaWtLenZESEEwZVorOHFFQnNKbmZmV0ZBeDZ5TE1adFJNMkhidG1YNzdpL01TbHYKbmFvR0RNNDB4Zk9BY3BlYWxDNFNKWXBpcVJ6a3lFTmtabTNqUjlQVjdMMHRYNHg2Zis0aE5JejJjbkRtaHpYNkhnM0hIQURqUEpwcQpoY1FmbGduTjFzZStNdzZCV1U2RmIzVGlhNHdPSCs4enhFQW44dHczTnh3WlZuU200MW5mZmVsNlFFUmZHbHFsQlVQcWFCZEdneWk5CktwNkZJYU12RFMyVkVpamxKNzlvN2txb1BvRTV0SHBRNGRrK0JZUnJZWkhsNlZZYloxOGNINC9KWTdkclhxY2d4cWZYWUwyUllhdEkKYzVjWXhvSmd1U3JjQzBIWVpLa21QMWxPUGdtMGhoV0NYTGtXMEtJbkRaUXdvVWpodkxRZUNRTzRvZGFlQndGKysvYTdRNElkeUlVSQo3VENndGVmNzRzdHdiejJTU1lwYTh3d3U5MTQrUGZyK3lXSHRpOXJkVm1mUTZwWW42Y21uTmJwU0FTTUY1ZUhIc1ZzVk1Cb2duM0pCCkxsMlRxWlRlT2trYUtlaGdxZkV3OHUwb1NiSXV3NmZvRTNLNXFBUjFWMHpVSlZFR3B6Q1k2RnBPYVZBVjBvYS9KWGgrZ0xKSjZ2aU0KVDVvRE9sRW9HMUZvTlA2VTRQclJRdHBMN0JhR3dqTXp4anFEb0M4aUo0dGFnWkVHTmZ5YlpXZzhNN1E3VFJKeU1FVWFTcG9DSDduUApaVVF1TEZ3WVVCMlZBbGxwaWdRblltNW90T3FZYWR3R1JzTnZtVWtwRHNvb2RKalZjZUVMbmJ0K1d4ak9BMGtaMmdRSVQ1UFM5TWs0CjZNRHVuZkJMU205aWozZm9ZS3FMQzNRN2dWbU8wNXFDM1N0REk1MUFucEFocVNoMHZzMlM1YmhzRGxxdloyUVd2bWJwQWxzWExuRmsKc1JJdWJWSU9lMnRCenZGQ3A0YjBMbkxpWVF3aUJUckQ1cXFFOVg0TG9hMXdFVW9sR09xY0ZETExNQ0YxQnZNWW94QndvdU1Mc0RDeApDcE1VQ0xDMkg5eHpNUGNkckMvWVJrbEd3VWNCNnhMVDFtTzRHS0tCNnRBTGxFcEt1dldTcFFtNkFWeVRXS2xBeHoyY1ptQm1rcElGClBjMEtQUFJubU9HUXVvUEpEclY5UHpkTGhNMXZXR1JBSHI1aGF5alNHeVBQSkFHQUl4YlBCSGU2TkhXbkxtVVYwZldzR1prYTdiWFYKWnphRWFiV0J4T2lycVJGQzRPcGpSTkdWazZOa3d4aFhIU2VvTlQxU0ZLdTIrbGpaWU5lSjBYTEpLVmNkcnhuY1FseTR1M3hQWTBDRApjK2NrRE05N0RBdVFBRUlON1FDWjhqR3ZlTUFRTlR3OUZOcGZja20xZFV6WmtFaE92V25TcEVDTkc1UlI1WURqS09mQnp1aE15aFI4Ckg4VjFaQzZiNHArdVcyem9oaUJIUDdJYlJqcWxiVWZyUkVZZzBBcFRlaVZDWU41TWVybElGclIxNEFOYm9JL2lsWEk4aVNsN0FOTVkKZlFSSGtqU2g0MVZTb09NZmtHRXdCbXhZV2ttVjJ5clN3SGFwOE9WcEc3Mk9FeW1qd0FDODFRQVRML3ArUUdrYmNNOWxpR3lBcGx2ZwplQmlhaXJCdlpUaFkwRzBwaFV1aGd0RStDdHJBeFVXdlp4VGFuaGxncWtsQmk4THUwaGd1ckFHUHpYVUNyQ1NER0V4VmpWT1VJdGNUCmlzQjNYSm5pM01IZUl6ck9oeDlTRzJ0OERuc3Q5TThFQ0xRTzJBci8rRGllZHh2S0dEcDZHbVZjdmhVWVdMcGtadDhBQjRnUXVhSGEKN2hZVExIK0Z2OEFjVURtdUlFbzVVdVM0VXVHb29QSFpYL2lScWtsWTlpUllwRlBXOEoyQnRDQ25BTXdscmRHM2x5clkrdUd2SUFFQwo2cDBRTXZWRHdkOVJFMGh5bUJRZWdyUGFHQnlTSkpYb2RFZ3hISWVDWnV4N1dERGNDblVRTkpuaDZjbytOYUFLVkZkTlErblVwclFGClFXUjFVNHBNZ1Vya3A3T3gvTnFHaTlrNjJHQkNsemFBOVlJZWhiT0JYSmdCUW9CaTdKTGgyZ0FnSENHaExNaFlZWWVDUm9RUm1ScTAKZytseFhCenBnbjVQR0NpQm1WQXIrQlFWdmNBM3NmM01WcVZBM1VhdEMwNW5hUUVEcXpCRVc5dUR2ZFJiL2N6NjhlcytKWlNvSFRRSApNK3huMTI0NkV3MGJZb2ltWG1kTFNJUjlqaTJSYkUxSVJIVHNsNWtOS2hObzFrM0l0WVlkS3hCaXp4VVlJb1lQU0tLYlBLRkllb1RrClpBUWpPenJPZXcvQ2JjWG1yQUZJUnRFRzBCYU12aXpjZDl4UFFCZUhobE9xZ1FDWDdNeDJqaUZIRWNUWVorc2NTRkNXNVFJUEJOYlkKVTJocGJkdnVxbVhhOE1adXJJYStBR0tOaDZCbEg1WldqZ1kxaG1FMlk0bnhHNEM1U0FraEEraVZHMUkzUFFoNmhBSWtvRUhEczBWagptK0x2MXBKbnlWQytkUWRDUzQ3N2FxOGVLYjZPQ3BLSk5obURCNUdVcUVTYWFFc3JMTWN6elYrQjNhNGJEdUM2Q1VzT3pqM0dmMDJwCjBkWWVmNGZXOFFhS3IyeG56dGcwT3JBWm9BcVprdHhPckNxQlVUaHdFc1ZBMWdiTVYyM0R1U3lFaGlpbnQzKzUzalRFWTBJaFpkeFoKbHN1ZG8vRE44a0pFTlFNRTFNczhzV2tTWFRWNm1naDBuUmptSzZKTnJHSHZiSUo4VmJpM0EvN2NZWU50TmNzb0t0Q0RRbWU1M2pTRQpNWEd1UDlxR1F2YzlDSmNWWUkzbXNxUWd4bmd4QnZSVG1Kd0VyK2R1ZFpJR3lrK3AyQVl5WnpmVytQaE9EVlpiWm1pL2NkOFZMU1U4ClVEaEF6aTA0QkRUN1NkR3dUYmp2WkhMSU1EYzZGeENvL0dLSXBzZkFnTkFHUTdnWERnVjNjb0lNdEw1QTVVeEhoRUhWSWsxOEZWU3EKWVhRWUlYL2xGdm03NnhKWGRsMTJ1RDFGNkhWQ3M2a0RwSUthNE1yOGxYSHpkOWMwVjNZZEcrOTNhNEZoQVVwSVVKZzBLRUVaR3FkZwpiOWNKMlN3em5jaHQzZzIvYTU3dU53ZjFVZk4wT2tCbGxhQVVjdDJqaS9MY2ZpU1hPR21sS1lXQm9rbEkyMWdBL0VCT0c1TFg5SlY4CmU3Ujc4RmVzcFhQN0ZjYlJGbVdrSG1Bc0t2Y1ZWcVlUM1ZMUGcxQ1Y2R3R1TjB4RUtXM01DWWFpK043UXQ2aXo5QjMzQWhsOWhxckMKZlNYdkQrT2tMN2FMZFN1NS9jNmlKNzY1YnMxeFgrdnFFUnpDZFZ3N0FvTWJQd2RsMVQwc2k5bis5V1JBQnowUmxpK3BLUk5ONjNMQwp0NzFDcS90WGFIWEdTM01UOFI5ak0rSjhiM3JHak0ybmVLNU56VVEvUjYxVE1KNjhZL05haDdFZG0yalRrMUdOVGIzM0QxRmdacWN6CldLWThzNVBwSVNaK1prdHF3aUZtMWhDdjBPcitGVnFkTWNRdVhoVWxzQ0NsdXpCMHJRKzBiMG1SeVVXQ2xpazNCdz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJYkRoQ1VrelBDUjZKOHhuckxyeVh6S1duSWFIR21XMGpuVzZEYTUxUFlNVnYrUlRHYVVpb3NTQ3lBWFJ6MnB2b0w5bys4RFU5dWZXUAo2bjFYL2pwNk1DaWJKMmY5MXVWd1lvY2lEOXNMUEsvbHhnZzZwT1Y0b2NhZTJDZzBCclFiUlRjMmM1bnF0UGJ5d2V4TkRlWlRJVktRCkVWTjdXNFlPWEtYdDVoYStITGt2ZGZkdCtvdjdQS1JwWTBLVEtDNXptTHEvN0dVWVpLUGN2aG0rSExrdmRmZHQrb3Y3UEp5cjBxRHIKRmhRWWN1SFdDano2SlpRWUprOXV3Z2Q3WTVPRnNyZWRmTnZ2VVRnTTlMZGUzd3NKSCtNZjlyNjl3Rjl5Kzh2ejdpWDgrK3owNTdJMQoyck8zNUdyN2c4dmg2OXJUWnEvNXFoelVuZzNhcUE4dC9LMW1menhvZHJzZGtPUVhyenN0Vi9JN29QNWVMYTFkakJxMUYvM0xYdnZlCmRObFBhL1c5dStNVlJMS3d4bmhoWGJzZ0ZGRGhVYmM1NHZJd0daNzFnSjJ2eHdvZnZHNE9XdjFtdDFhdlBTOTdyVTZYaXhPS3RpMDYKVnFFNSttUUluM3V2TGtzdTZ3WnBFajJod0Nya2hoM2UrN1RXc0t5R3NSbGo5QWNlc0tsZXc1REUzWWF2bUhrVDl5VDcveFQzRHp3MwpZeEJNN2NHVGsvMEJUTjV1U1JpT09xZXdlazRPanFHa09VR09uaEJoei9zWWFIVkRKTTBaYktBa25ocjRGZWNLL2MvK1B5Z015YUsrClhxbnBkS0psT0lpTnRadGNVN3VhMnNXUm9HYmhnRVlORmZTL0NvMSt5SUdadGFwd3VrMHVLNENCV0t1eGZwZmRxL0YvY1h6dTFWejQKWk5pQ2hQK1VvQko0TTlUTVdjaEVrVjNFam81dnkxKzRjRTJNZjAybnZ1Si9jWm1wRkZRU1dqdTQzalI4a1JnRUFkcGhXa2pMZzJRdQpEejdzaUJiMkYzN21lYmgzNzIrOS9pODkrZ0liNWQwSDNYZkRZZlBrOGZHbnRYdmZ3b2pCcG5QdkFleWtiMHN1Y3UrZ2YzNkJVLzlSCnB3dUVZaVVZOUU2dlpndFlxRlhlNzdraW40UHVldStIenJBRCt4MGluTVp3UEdxMjNxeUFZYjg1N0xUaTZvUCttN0o2ZlVrL2RKOE4KWEVYQXVPaXA3WHUybU9OQXJiSnQyL2tlN2gyV1o3WDd0YjNhM1FnUGJ1ZjNhOVJzN2Y1ZTdkN3o1bUEwZzdLRGZxOTkyUmxWSVdvQgpGaVIyQmU0dTVBWGlDcHg0eGxQbTArbUpXL3VuUUR1VS9ZRSttU1RQUWVYQ3hGVmE2NElTTnZ4VXUxamxKV2d4emxIZkcrU250eHA5ClB5d2Z2aTE3ejlydGlteStUZ2JoTnB2a2lzTFg0Y1JXME9QeE9oUDJhVDZqOGVZdWFPTndqcVpuKy9KQ0NWQlJWL0doZkNpdUxHRFEKZnJmc3RUOFVod2paeXFzcGtCZnF6eVZrNzk3RFg4dldKZmFCZnFDNlU4S3VoKzdDZFpaejc5K0hpWEcwMjUwVGU4L096b2JsNkZNYQpnRG4xWFlVbjNlNGxuV3I2ZzBiekF0VHNlM1lud3B6eWpuMTN4NURXam9DVnRZZG5aN0JSUWVudk9xT3JDTjY3enk1SFF6Z2ZSZDdlCnc4N3dvdHQ4Wjc5K2VvM0MyUzhiQzdka1Blblo3bFFTS3B1MlpqNzBKdlRCSisrMVNta3llS1JGbmtlYTJHMEk0YTJaUlZ0RVUrWGQKcEphYWRMMTNsSjNtdkRhYTgwcTIvQThpaGNTSFVBV3RSbkE0NkYvVWpsODMyLzFmRmlzUVdOQ1dhelE3c3pXSE1WeGVWMWpJVEUvSgpSYk16Y0tTaEJiZDJGMS9OK1hTT2hQZG5GUEYrVEIyMnV0Um9sbkNyN2ViZ2paUHpGdkM2UC9pTkFHaGZjN0QrUmJNMU5neVh3L0w1CjhkRis5M0l3VnZjMEFNZ2UzQm9PV3ZIMzAyNlB4ZzJPRU01Z1RFTml0YTNhdzE4dm1pQmQ5OHV6L3FDcy9WQU9oaTRxN3BZM216RUgKNVMySTVrS2E5UmJOTzJWL3ArenZsUDJiMlhtdks1eDFkd3JZblFMYzVaTHIyMnBtaW5seVI5VU8rb01lN1BnZlNzeFBJSzJvbXpVRQpCclk2WlFZRGVpNkg4NmI1N2tDek5RZWFxM0ppWjZ4ZVJiRGs2NjNEN2xiam1xeEdWSEtTTk1NZ092Z2dkVUxPSmY2QUZnYUY5MnNtCi82NloyOG51VlBFRGs0djJOU3BuanlGemJRMlB5dWJvTmZLNTJsNkdVWmc2NTczc3hjSzk3Q09TUXNWT0N1MmswRWJwQkdzZ1NYSzgKZUx1VEpFNlM3SGN2eTlxMzVicDc0RzlabEdBb2R5b1QrOGFPeUdSV3VHajdFTWVkYVludnlZVElrWW1BYmdIREtpaWcyK2pwWUc3eAova0xvTm5paUU1TmhtSDlEWmpJM05pKzdTQXFLNWNicjY4TG1mNlRJTzJSTldraGg1ckpHYkJOcmpESDRTZ2ZNRzYwemtidnBrZ0pMCk1sUUJOWnU1c2dJL3plVUpKcGZjRnBaa3VhRzUwVkNTbmg1eEJqKzZBWUVzUVhzZnpxSE1vTVZ2TGtzd3ljclc4Q1RQMGpRWEZJK2EKRkJuZkV3SVd1WUEwV0Y1UzY3bThVQitHRVIvY0dIWXJLeTQxT3FWd2VwM1NnNzU0d2NzSzZrWnFweFJtRkRBcUl6R05VYjl5TG1PdgpaNFpkcjJNdnVnRjJEUTZLclpnajJxUjVnZk1nVFZKTWp1MFdtOTJYTUJtQXdGdHNxQ1NtbU1ocDN1d3dHemc3cE41TmoyWFRRNms4Cnh3MUs0bzBBT3pjMDc5Z0dVeVBpMU5EV1JETm5hbVNiT0RXdWRXYnNEc3M3QTNvNGNCNjhIdlRobVBuWHpxdlhYZmovYUtQT25ldmkKbFY5OFJXMmhUY1ZXb3RKWWVLNWRaUnI1MVdOSzdqMStkdnJ6QzVnTlg5VGkyM08xWlhUY2l5OWFZUTVkMTQ4UWcvV2c5NnBidmlnQgpHOHljNy9yNGs0L3pPdXdBS2NUWmlmS0g1UVhNNWVHejNsaTRGemxaZStXUXpFR0ZCMU9Oc1lJRSthRTU2UGhFWjJORTNmdSsxMm4xCjIyWDE2SmtYMVdNUTU5NFNUNlFTQmEzZzFmYWVaSkpiWTRReDJ6eHZsckJ1Wm1YR1BGYjMxdmM4bDVyM2hqYTkyOUYxdFV6b3VKMFYKQlQwWHJXQ1dpWlFDYnREbWdQcU9zOHhNZnBnLzBUQXIxZXJUN0VZT25WYWF1R0E0dkVMNm9lSXZ4bEJXc3pNclhodm4zYzQ1Y2dCegpKbUtxYmc1Q1BSdFNmQ3duRy9pNU43cW91QzUyd24rKzhKZWJLUHpkTW5NUjBYTlhYbXBrYm5ZaXZwcUlsMlNBM3F3VDcvV2RhUlprClRKc1RUckIvQ210cFJqNm9KRm1ZRVlwU0pHMVEyS1c4cG5qNGozMld1TGZrdG1lUzZCdU4vdDZBTVU3ejZ4L2lqODAyTW40RGEzUE0KSXJ2SW50dGF6dXRqckZ6UCs0alo4dnVJTjNIOWsyOHE2cW1iaXRsNzNGVFVremNWeGNSTlJiSFJOeFZ2VFF4L0ErSjJsM3RwSjRJcgo1MTdDQ1RNejh4Sm1YTUkzTStuZnBKYnFOR3VrR0JZa2lpSTFqVlFrK2lOSXZBUlN0S0JRcUtTUU5rU2pLQXkrdTBCME4zSmpNQlA2CjdlVDUrTmhrMjdOTDdQcmpidjhYVE5TNVdkNjNuWXpicVpuT3h1OW44WHRybVRHcWFrcm03YXFRNzZNZnlwMCtlQldaK1UrQU5pKzcKbzU4aWFYbmNPYi9vZW1rNUo3SEorenQyWnhFbzNOUjREdUo0RlBXYThvbys3TFZEVnRHbHFVbWZON3ZsYUZSUzM1K2ZWdTd0M1gvRworYlYvK3BTb2Z2bmIzaVI4NzNscm1pMTNmM3pkR1pYMnQrb0xCd1lUOWc3R09ETkgyTjBYai9kckw4cTJRNTBZZXNHVlNoc3RWTzdWCk15NzdqN0tMeTk0V056SXo1REFJdGl3dTkzaFFsajFYVEl1c3NJbnRHMExxMUlhNmU5S3c5TUc3SmhmTzg5UlFPR0ZtQ21HaWhMcSsKTUY2L2NJV2xLZXdWUUh6WjBtWHpGMk9GbnpaZmxiMVIwNVVIcFFvb1JPcXl2TWhJcTVLWnBMc0lpY21VdTVSZ2NncUZGWHc3UWRqNApWMEw1bFNqUzJ1T3YwcUsyLzVYU3pMWUVxaHFiZDE1SlJmaFRTYzhGSjBsU1VBTE5BcEZSNG9ZRVgrQWpoekpGeVZtMEVoajArQ3VaCkE5clUrQ0hMb0doS0kydnl6TjZIVEJKaHg1cWpuVlBmelRGOEFIcjhWWkZFK0xBdThKYWl4aE44bHhtUTVOcG9kNmx5S3RwWEVOMGUKSC9aUHdMK0FNQWtJcFZBVW9vOVBEdUk0WkNLMVVlcUFXNlgwbzRGcFdSaUtFQlFwTU4waDFOaEI3UEQrVjdwZ2hFcUwxUFVuRlhtdQpIQ1lYN1Y2aytCK2FSc1JNeGlTUmRTbnhMdVdSeGljSmM4dXdsS0pYWVdLbk5yQTU1OFNsR1haeENwMmdrWUJoak5CcHZLSWg3RjJOCjFFNmNJa2x6TzZtMXU0ZWFNZWVBV1lrdWVNS29CQWt0c0h1RzhXWEtDR3NlQjBRWlRRZDhTUU1qS0J2U3h0SGlBM0J1cGtqTFFZdFAKMDBEa0F0QmxpaGVOU2ZGVk1KeXFHcTlJVUU5VElOamVLdEdaMURSN3BNMFBZaEZSdHhUeTN6RC9nUTVhSG1tcThCVTVaQnFsd1lXRgpsaGh0eHhYRElCUnlRTnE4cnhHeUJIbW1lVlZrc05TMDdRRE0zU3kzekJjOGhwNDZPNUV0bWxSNTRvVHdpSEtsNko1TWtlVFVLNlV6ClRjRVpPQUV6MnkxL3FjaE1kY3ZnWWhVNlk2bTFXZ0lWd0tMc1ZNVmVTY21yS2M5MFNyelIwaWp2Nm9qQ1F2Z2FRdWlJU0xFamVjN2MKTG1DeDJOV3RGVFdmcEtwUU5neWZIaXJ4bWJZVGZNbE42Q3dNcHV1WkFieUs2Rk8yWXlTdVlieGdmZEdhVTFvU1JzRTNSUktlOWFuRgo2R1k5VFhvVUYraXU1RW1xSlhVQ3hJUndpNm13VTFWS2l2bFZRVHBpN0l5OWdtSm5mWUtMRWdZRWU4WURxUXF0cVE5QWVVRkJOYmlhCkVrdXd2UU1WaVIrV2ErN2FENittak1XdlVMeWFRUHdnT2lJcWt3bE5BNEZ2cU52NDlNSWtGTGhFRDZZblBEWHc3ZlBIWHlIRmhSY2EKQW1hYVphQXFwSDNmSnM4a3pZZlVyZnZBUHRzL0ZocVMrVmNrWWNmTjZPR2NCRjlXNWFVUTlnRXJYakhDQ0tkUHZBMmtOQTVTOEM0bgpjMXg3c0hxVkpQbU43OXJhWFRyajZXRndwMEQrZWZLQW16aHBjNXI3bmxNZ2xSVXRPc0NaMnRrTGROQzhNTG05YVc4c2xBU0d3a25qCmVhOXg2eE9wb3RXWmVkR1kyb0VERHRIR0RkeTJLd3prV0VGeTIyOVZMTWpUZUt2Q1o2dGhxOEloelQzU1RKTWlBc2lVSUtUQS9aeHcKd1Fhc0NKbVhhVzVBcE9ZOEFJQTB4NjdTaWpYYXM5RmtWcnJsOUZJcTNYNnhHbFFpQkYwbzhoTGNYMnBRTWhvZEZPTEFBRzFvbWJEUQpUSVV1eUVLakNwRmJ3WjNDN2tYVHA4Z0xDaWZqWE5uS2loWHNQYUR4VzRUQlpTeG95OGtsb3pVeXRmTS9Vd21oelZVQ24ybUhNSUlHCm0zZWVsUGRhdDNmRU93OXRQRjc0cGZaeFpMeGdLQkppQXJBVEh4Q25TM2ZFQkRmbXVPMjRPU1hHaHd1bktPM2JYck9BTWJJM3NnQzMKWlMxTWZhdFhBVlB3eFdkY21idzd1Z1VKU3ltd3RrQU9XTVl5WDFXV1dXR1l3VzVrN0NMTUJDMUxBMnViMkNpNXI0S1hWZUtDOFFncgo4VFVscVdzWGszWE1ramI5ZWMycXg1R3VQY3NoTzE0NDREaCs4MjVwVlN3VGFqd2J0RjUzMmtzcnVXS3VIcXUvKzYrcDBjdnpjejRlCkxtclhGcHVKNG5HLzJ5NTd0UmNVVzdVRVQxd1drYzAzMmtZSTBEaHJDMUtWUlRuMkp5cTVvbllYdS90NDBIeEgyYUNldjFycDBHUDMKV3BTZ2ZoK1QyaTVtZkMrVGtHallmbWk5dzduQkJuZWlnaVZtZkhCaUdlZVJ4Tm5wdDM5VEtDdWdVbnRmRjlZekxYa041eGVhaU9ILwpUbTlESlVLalJOSXMySTFPTTlwVU5DajZ0S0hDSGtwQnBpQ1liTWRTN3Mva0I0czBvN1dJU25ubVJTY0lYMUltdEVCaGdCK1NMQ05rCkVyWmIyczJVLzMrOFcrTy9LTmhZQXNHbXIwaVFvM0FwZFB3aHliVGI5TGxia3g4Y1lra1NrODQxOEMrdmJBbVNsOGhVV1c3Rklld2UKMm02NFJVNXFqdkgvSDl0OGREcStuOEd4alFTcmhIT1hzUW9QakxVOU4yVGNwY2tQRG1ObWQwalNKVEtXT3JDOUdPcWJRQTBzb3c4NgpkY2ZYM1AvZnpZdEUwYmFQZ2h2KzVWTk1yblJoSDAwUUtjMHpVSjR6NDg0MTNKZkpENndBSkhTWXdma3J3MEhyU3VsdzZOaEdlb25DCmdZVi9lVzM5V0o3V0R2cmQvZ0RPNmYzTEM3L0szR1FHQ2EzNDZoc2ZaaUlOdTRnVk1wTjZGVnQ2UlE4a2ZwS3hHWUhXQmVrNWJxUE8KV0EyUUZpTlBGYXRDMFo2ZGVSMEt5RXhwL3dBZW1kUVpHK1lkVXJXZU9xVGFQdGlSTEhCRXBVTWg4REViMGhUakE0aEZJWkdjTkhRQwpGbU5tdlRHcHpQQm1tOVVSN1ROMGZNMXRyQStTNW1uR1MwbkNTdGMwcTJTR3pNTG1UV2FjRXNmWDVTSkYwL0VrTDhMOEVoYlo4MzF2Cm8ySlQxQ3J2NWh4MWhxUFlQRGNlTXpEdDdJalRYY3k0aVJROHYvRUxQRk4yTldyMUtxLytpQ1IrUWhEUi9CZjA2QT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJY2pUcTk5d3p0OU1QMzA2OU0zajNlZi9pKzR2eFdrZzFVT3kvUDIvMnl1N0pRYmMvTEczQlo2NWNjMVErNnBUZE5oZDgxT21ldzU4WAp4MGp5Y2RtRTdSb1pNeWpiblJHK1JJOFBhMDI4VEgvM3I4QTBlb0N1WFh2VWZOc2ZrREh2THBINjZlUmJlSmJHK2J4eTQza0lwSjJYCnZSSDByNGtQQi9MMzJoZjBMYklSMjBlSnJWVjd2MXVXN2FQeWJQUkRFNjFvdGNrWC9wTGFXUmRmZ2VyQkhMZ1lsTU55OExhc0llRVgKMklmaDRncXRidWVpMXVxamtmZlgyZ0E2MmUrNUdsbjAzR0JjWTlBY3dteXJ2eTFiSTVCRnA4MXVzOWR5dmJyN3o2ZkEwY3Z6Mm90eQoyTzllT3FPcHo2OExpRVROMDN4Y2ppNHZLSnpjNG4yT1hSL1YwUERzdWh5aVNJQ0R0YWZsOEhYdEJUWGUrWTBNcjFFenRrYWFqTldBClpYRnhPVnBTSndsVVRuWHVxTmw3ZGRsOFZkWmdMbDVlMlBMZTJRRExEWWgvVVY1Y2RvY3h0bWpRWHVCeWkwWnQvTmZ2K2hmUmIvZGUKUGozNnR0OHVaODZGKzdXN3Y1NTNlL0J6SGRnMTZKekNnbmZEZE8vQkFKUXVXK3VhVVh3QS9GRXAwSmk3N1VIcEdNY3VHLzRWL3huNQpkeWp2L3JFM1BIbmJIQXp2UjlNcEx2bzJNSkxnd3pubGVuNTJ1WjRNeDc1dEtIZDYvVjVaZ1RIZGZ1dE4yYTdDR1M3NWdTYm1WZWs2CjdmVGEwRkZSZ1RhWUhMQm1yZkJZVGw5YytnTU4vM3R5UWl6a1JDWDZPL2pBYTVXSnYzUlVOMm1oZi9HMjhsTEhvcmM4bzVFOFVHOUcKL2ZQYmxXVFhOdysvR0RaUm1VQVZCNVpZMWVsNDdldmlHQjhqV0p1dWJNTXFIWjc5c3NhNzhTMHZneUcrNGIzaG8xeUhjN014ckxMTwpvL1NYVHB0dUN5OGRYMWZ3ZGdWd05acGVseTVqeDFLaXVPVHRVaVhSNDdHTXFIZFY2SGwzMjZUa3VwRExLUG0xa2ppNWJVcjhpWHNlCkdhZjlFZWdCZUxCL051aTg2dlNxVURWZFp3MzJmQkoyeC8zTFFhdmN4MERZVzkvMFlXdTY3UzZjbDZObUczU2c5KzFIOFo3OStIM2IKbVRTcXpLNm84T2V6dHFLeHVYUmNkdi9hSEIzMlcwZjlWck9MWjZraC9UNXIzdm15UUVzNWVISVlsNHgvL2c3MUkyelY5VjZvUnRKSQpvcTYvZWZEazBXVzN5M1lhRjdRSnY5b0t5bHRubnNNdkZ5V0ZlajhlZE5vbnVHUWVOVnVsejNTQVEreGVjWHZlNy9SR3lNMnBXc2RBCldiRGQwRUJNRnZtKzEzRzkxWGt5cjNVeUJEMzhkZVJadTZBczlqUXVxblNPd24xbTQ0KzYvZjdBaHUxUldkemRza1ZsOS8zTVdGcjAKQlJzQUZwVWt3cUlPNkxsa0VjNW5GODFXWi9SdU1VY0paK2lvTkJpdk5yc284aXB1UFM5eXNhQm9RS3JtOC8rSFR2a0x6TFhEem5BVQpMSnRHNjNRQllzK3JISk1UVVVES3NwazFJbk1rRlZqR09oTDNFNXhieEdUMzlCck44YmtMNHFEc2RnOUFXcnVDNlZ5Y1dQQzQ4eHVQCnh2eHUvclUvNlB6VzcvMDFVb21RYlhyUk1Idkd5VG1sdnZPeWJuN0RoR21TUWQ3YWJTTGJkYk0zNnRTYTNVNXpPRjB1dG5IM0wwZmQKVHErc2pjcGZlUlY2TTNIQk5tc1VTSCsvQkd5amQ3V2o4bTNaSGQ4NUFLVThPYjdvajhocDk3VGZYbUs2NXphSGRLdGl1RXlnRWRFVApFaTJwMVRXYndPZFBQYzRrUTVQbGgyYXZNM3dOcEVRemtWeCtlU3JNVWt6WWgrZmRacS9FU1JJTHJZVnJtMnBRY0h3SG1ZZExvWXlXClQxWXNYejRCejNmOWk3anJWZGRmUUxCUEtsV013MlNBQXhGVndUR0xnVm1ocXpFUVYvWnEvTHZzbGdPcitqM3B0Y3Rmajh0V3Y5ZGUKcmM2anptQzRwQm1hR3ZPSGFWNDFUODc3RGE1SGM4V3g5ZlduaGpiTFJMV2h0ZTYyNlpGbHlnOEcvUXYwVnRyTFpOT21pUW5OS1JjMApwYktwZHFPeEdXL0FKVlI2NnE1UGd5NzBZREE2N1RjSDdacVlUcjhVT2MyOHZIand3b2tRa0FvcUZncXcvci9ydjdDTld1TDd3NDdmCmpDVDNvM29WTVNIWW5neTVyODVqL2UyMHRzc2xZcFZ4Z21tcFA2ZGZOTnZ0Q1lGOVRvOXFqSUdHSUdzblFDQ2MyWnZKRzB6N290TVkKRittdGZuZmdWZEVIVDJvUExrZDk3elFzSnpDU201RFY1TnFiWHIvMUJnUjM3WlVOeVZoUXREUHNnOWd0YTZkNFdjY2x5Um9yWE5RdQptaGV3RHd3NzU1ZmRabkJReW1qbkdRMmF2ZUZGRTA0SHJYZlFacWNOcGJtTFdpcVpSMldiUEY5YUZEUWlvZVhJZXp5bldFVlVyeUtkCmExblpBVy94c1RJd282U0lPcmkwYU5TQnBXVjlCNFJKODlTWDVEUEVRYlAzdGprTUdvNFlHNy9uN0ZESCtJVGF3M1puMUxTQ2JVSVQKSTQrdWxUZVJVL2MrL3V3dmVrMU04Y2w3WUJNZWJ5RnJNQmtmY3g0YXZLcG1YZUNMbk42MjBoSHFFYkRDcUJKMWZMTFNlRXVpOXZENQo4Y3BOMlZyTDIxclZ3ODZ6OC9pSHg0LzZ2VkhRQU5Qd0F3eExxelBtZG5jUDZ2N3dHUHZ3ckdkekdFNys5ckk1dVVpcHd2bEYxKzlTCkU2M2o0VFppVzFUdCthdXpjZm9BZHZqZDRYUkJsQ2QvS3djVHl4bCtlTmdER2U1RlFkVHd3L1BUc20wbDBMaW9ndDhvTk9lN2FTdlQKMUFHak4wWHJWSkhYL1YvKzJtbFBFSDRFN2JKMGZ1TElXUjdZUWZOdVFUREh1RWFPVWhaVjhRZW9pc2NjOEdVSTN3RUdweHk0NEpRWApjWERLVk5GblRucytqclhuWkY2cDc3eGVIMGU1VUJITDlucy8yUENXL1RpOFJVd1VmVFlSWTFNbC9BV1hUR1UyWWVFbGZMSVlxekhLCmxsM0txZkZpczFsbHkxVGpsY00zUHlDcHFQWDZJV0NwMXVsUlFCSnFHS3haTFJHYnJxMTd3Zmg1NytmK2FZUFFOYnRkM2hHR2swYXoKcVFvZ2lXQ0hmVFZCd3p5OGkwc04zM1F1VG9FamI4YWx4R1N4QVp3Y0I4TVNxUmtzTGduN1dSQlRkNmVWd01ueVRIWkUwWDIvcXlHagp2K21mUHVtZDlXdkI0TGFFMGZONmR0b1puVGN4OUd4Uzd0dTlJaTUrOGVyOFRlTVVOOHYrMlZuRG1yUGRQajYzK0Rrb3djUEo0clBZClBvNzhjbGpDYmtNYnMxK2dUaUd0L1ZpZTN2c0JSRi8vM3RNKzdPZmxUNHZaaWF3dmlUTmptdlpVQjRhamJxTnRtNkJKd2tPNlpMU3cKbWlzZjdMRlY2bHkweitIbmJxOXlweTdhbFpIYk1BVmZZOWJZWDF3TVhMRUZZd0psWE90dW5JV2NPZEpRTG5JUlpzWGNVckhQVGVUegpTblhPWVRFM3VuQ09xMVp5MU9jQXYwSXRMamtJeldkNmJpOXQyWGpHM29YSkJ4SzFYVHQ5VnpzY2RON1NZMzRMQmdHeDlPS2RZYnFoCjFnVFg1aGVLbWJZQVZUK3lIUzVBTmxGc2F0Q3BGQjFXRm91MGRqbnN2T3JOT096TUZMbW56cm0wQ0NNVjdKOTFKczMyczJYNDBFcXUKeWlKMWJEaW1xZTRPR3VmZXpqZXZSS3Zmd3lSdGVGcGRRQXVXOUZ2aXFiMzBaTSt4TTBzUDJvMytBSlgzNXJUZVBWbndESlFGenNKRwo4YXd6UzEyNEUvNml1VUN0dm1vc25IeXVqQXU5RXNuY1VrUDB0VEN1cGVYZUxxWngyTHJvdHQ3TmwwcTJUS3MzYVFpYkxET0NzMTUwClZwOURINHhUdDNteG5BK3UzSUsrMHc1Vzl0QU50a2p1WXFraEoveFlPbk9wdUpYVFlXRlVxUU5UZm9TWllseFA4R21sZVhzMGlIaFUKRjhkbDBZSU5la21aMXFCL3NhUUlLbXNkVUYrV0ZCdEVtVHFXTllvR2c5UG1ZTGhnSE1kVmpMQzlWQ2c4aWtoYVZqYmFZeXJvUmFFYgpGUXI3YmxRb0czVmoxaW82NjQwYTdlNWlrV2ZMWEF6TytyMUY4ZzZMRFM5UGVUMm1zOFpvQ0lSNk44dk1VUnlDS29ySzY4SWl2ZkpWCk0xaHQ1eFRDRXdnb3RNUEZzd2JMd1hiVFc0eXJLeEJiMDN2YVpvLy9zREY4M1lSRFFMbUFTMWlvSEtIUGlIUDRSeGJmaVlManBiSloKY3Y3WGk4YlkvUTNxMnF4U2cwbmRudXhIczBxK21uRUttRlhPN1lMQndUWnJmb1Z5MWltMnVHUzNzMEJrUUFGMC9qWEhEdEp6Q3ZZdgpXZ3VrQ2hVWUxoaHhLdEMrWEdnVFdDQjVvZnBpTlFOT2RNUGxld1NWT3J2c3RSYk1FbHZHV1NONHBpelpHS2hPczlkalcvdnMwelNWClduWTBhSjFINnRMZDd4dkhqWnE5NUFpbjNIYnRYM2VQZjN6Mi9GK2YxdDdLSlllemM5RG1JcFZ2bGc0SlpmQjQ1ZjA0YzdyRDE2ZGEKNSs4V0hOdWpnbjM3SnZmMDJmb0JGNDlPMTdFdFJnZEw2UFBPcjJYM2VUbkFwR1JUMXBqajV0dnlLWnlkT2hmZDhzRzRIZU1LaC9WTwo3MDEzT0lKRjVmMyszT3NudlRjMXZNVTIzbDF2Vko4dzIxN2d4VHMzYmphbjJ2UERSODZhaFZwRC8ySmtUVkRqSnNKditxZTFaL2FuCnlPYVZaZU5HdUxoVU1NdmYyKzh3cFErT0Q1NDh5ZlZoaVRNQ2YxUi9lZmJIZjM3MjVZOWZmWEsvK2ZMemI5SS9QcXZ2ZnoxNGZQNzYKaTFlOTMzM3o2SGVmMy8za29OTnNEUDlndnYvclEvUDdMNzcrL3ZHZm42cS9mSEgwcjArZWZqMjRiR1dQSHNxbitSMmgxTytUWkhqNAo4K0dyejVNL2ZIMy8zNDAvZmYzbDV4ZkRyNGQvay9mMjdueDkvK2gzQXk3MHpXai8xVi8vZnZUMWw2bzhQdWg4OWVmV1lhUHh5YXVwCnBvN2EvNEQyc3NOSGQ3N0kvdnZ4NlBEbm4vYlZmOWMvZjNEZVB4ckM0STVlZi9abjgvdkxSNGZxRHovdS85ejk1TWU5TzRkbnlUZW4KTTVIOUlTdk9zaC8rL3M5L1BmanVvUEhEL0ViamNsLzg5UFdYYng3OTlQVVh3OGI1WjRlZjM3bDhkUGR4KzJ6dkRqSHIwZitjUExzOApQUHZweDJ5LyszWDM1UmRuKzY5SEI2K3oveFpqN1BpZlB4NjJ4TkYvdnY3eUw1LzhhUEZBbDRjSC8zNzE3ejU4K3VOL0RwKzBuL3h1CnY1Ny8vSWNIeC9YZjkyd2ZYamJibDN0M2lwL3ZmdFo2Mk5KL3YzdndXcDNjLy9MQm5mU1BuKzEvKy9uL2ZQYjF3U2ZmUHpvb0wvLzAKNXgrKytmM3IrNjFXOHcxKzZuejI4T3pvdFcxWkpQZWEyYUR6aC8vNW92UHZiOXI3M1R0LythUSsrT3hmbHcrT2p2LzRIK3ovcDEvZgovK1oxdW5mSDNQL2hwNjhmOUZxZm5ILzIxZFA3OTdMemYzM1Z5Yko3dzdQMHdhRDFSSHoyNWd2aE1iWU92eG4rQUd6TFBpbXpIOU9rCi9VWG40RjRUeGxjOC9lcHUvZk55djVzOVA3Y1UvT1BvenRjSFQ3NzgvWThQUHkvMEVNYmx5VC9ONy8rY0hmVC8vZG1YUDdULytZVTgKL2YxUGhQYlB2VHRBMEovTm4zNlBRL0pQODZQNWV3LzU5T2Y5TjUrYXVwdWFQN1NQRXZIVDc1OGUzbXQrK2NkSHYvdnN2d2ZZaXNFZgovazFZcU1qZW5lVDAvejVSOVBtelB6LzYwbjM2OHNlSGY3UEZEejUvK0Q4V21meUhmQUpUOTJYeTJaLy8vUEJ6ZWZpWFYxODVQRDkrCjllWDk5cy9mL3B0RzBuY1k4RDNiMTY0VktMVC9qZS9BVDZFRDR1NVhMN0JRcVFpbWY3ZC9lRUtzUGl5SGYxSG12ODNQclFmZkhmNzgKMmVIWnZiLzk1Mkd6K2NrZjlzM3A5Mzh2bnQ5NStmMkRad2Y3encvUGpqdi8rZm8vUDMzeGF1L08vMi92eTdmVFozSUZuNEIzQ1BzTwp0dG1Yc0dNZ1FCSUlFQ0FKTzRFRXdrNzM5UHh4bjMycXlydnhDbngzenAwejV6djlhNEtOVktXU1ZKSktLdVdDdmRhUUltWS9QT3NYCmg3aTdrd3Qyc3k5azRmZDltUC81RGZzVDMzL1dCWm4vZHVHQWdLbFJKTktjYlRsODBiZjlYelg3VW5OVnlZSnpWcVZvd3hDYTRuMncKK3FlZHIrRk9kOFo3YWtLcGNIU2NTYlJPcG16cjZYUytuSnFJc2p3Nk1BdlJQUmdaVUc5QWNsN3lKNE8xMko5WkY4UW9tUzVnNUdjbQpnRmdnT1VxU0JjQWRMbzg3dDQwTnhHc2xwQ3gvWVptRm9EZ252VHllRVpYQVhQaDBlcXFWc3NNbkhIRk0wcjFMakVqSGQ5V1h4Wkt0ClB1RzBESkxVUUlUa0NKK2JzVG5wc08yYytXVzR1U3E2YXo2UzQxUWdBTDB0MURCdnhSbmswQXdRcWo4Ym1KclptVjhzaThkSVl0cHUKWmlOOTRsMjhCcS9sZFVjQTIxUXFlajJUbU5TU3hGYnphdDVnemJicU16ZlFNS2xZSVZmcnJhUkdpOTdrdlZmcVJiNkIwQlFKakNnRgo2NWVjYzNvbG5hL3JCRmtJOVFsM3FqVHlHcXpjdk1Dc3B0OWtzUkNLNU1MZWx3NVNPRDY4M1BFZ3BBWC9hT2ZLL1o1bWY3bjFwclBOCnRwWmRDd0JSZGJNQWRrWFA5cGtnYmQ3SVI3YjV2YlNEbjMzWmNtRjNiVWxwUzJmaDIxNE9nOUZ1bDVRV0xIYTZaUT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJUm9VREJOV3ZWb0RNTEI2N1VNR1BDcFBnOGozYnRrNlB3dmRzMldicll4MzlYWHVUU0tOeEd3SEF3ajNmUG1ISjNNcXgreUdUSmR6QgowKzM5cG12TXB3bllTM2pLR3NjbTU2TGpjZi9PN1RTaXA0Q1RIYWZJQWd4di9uYnhQRHB5SnlySGI2Q3hwK1pRRGordlA3SnZvNmM4Ci9UU1dIV1dTNWJ3UHZETHFBQzFRcytYdy9ubVlmVHUzZ3R4VDlETFFZK0NMdjh4aEdyZFJxOFdYVDM4dm1YN0pieUxONzRVRG53emEKMllETmFDbENuczdqcFh3dEF6K2xzS2NTL29qTkovRTA3bkhrMCt4M0tlNFhCaXYzSnZvVy9wbURxakNQZm9qK0RML1ZpQVo4K2tqOQpta0dRaDkvbEtHRFpwSmVNaEx5RkpqSHM3NHJ3bFNSNkdmNVpNRmpaNGVYZ1M4OGNIQW9MeENjRWtXRUhuMkova1VDdndORzhvaUd4CjA4MmlnUmlzYUpyVWhPR2dJcS9sZWd0K2wwREFPQ3dJaEpoRXpKREZTTkdmTEx3M0dndjdhL1NiQkh5T3BwSG1TSWxlUjhPanFMaFoKSkJvc0NkNFFQVmtzU2RIU2dkVVhMcFRFMGw2eEVLSmxvTEZRdjRIRTRtQ2phU0E2Q2NueGlHYkYvWW1Bc1poTEVtUElTTTRscGI0awoxSkRSSnhZaWhWVDRKOFVXUVBQTE1ZWXNXOENYYSt5c09GYVJKQlo2QURqNWtsaVAxRnlSNUREa2VPVG1ERjkra1NLcVNGSlpBajVTCkZCTk5FOUVrTGdTUkZvNG16MkttZUZxRUZMM01TUjNnWkc2MUJLdWE0cmdXdlE0cGtaVVFsUVE3d2xkV2VWQk1paDdRc28vQTZpZTEKTXI4Z2tpTXFJc2cwajBrcFFEUTFWalQxc1NHMUpLd01VZG9TamJFWmp1TE9GL1NKSWorY0JobzgvS2N2TlAxYzJWYW51aUV6OW5rTApXUHJmQkgvRGlHVTNZSzljMU1oUnZSY25qUzRmMk1YZ3ZLTE1idSsxQU11bHNNcThtOXVML005Z21DbE9WM3NidFpYeHpJblE2VlhlCm5lR2JIZTUzNU00QVgwem8wS0NCRmhaZVo1b3kvVjRyems5dWp4TjRXNWc1MDdFN1l2bmx1ZGt2Vkt2N0hIOUN1ZUU4Mjl3VVhqSnYKZzhNRVdMRHJ6Qjh1eE9KR3ZrUDhHVnNQazk0UnVSVS85WnVjSDhBSjdleUtVMC9Mbnd0N0NDL1BiOFJ6azBWaDdpcVdPZHNLV2twUAo1eGhIR05vSys0eSs4RnczdmhFQlhGUG8yOGJXNVBhYk1zOHVBSFNENEdmZXJiL2UvTXpDY1FGTENWanJvZjR0em9rRzF3UmFTamM2Ckp4cGNFOXJxWXpuVUM2ZEd1Y3dDMzNldzRqeVU2TnAzS05OcjBMYXVhUHVvKzVSRFppeEhKdzdVLzF1ZUJYS2tHWCtxL0ZtbzVzSjIKZ01BNXlUVXlINjVjdy9wMVF1WXdWQlVSQ1RyeGZSSEU5cWx3MVZlby9FYkdITm1BWndFSlI1TS91eWxIT3V0YUsvdlNyZ0oyQjlKSgpNU2MzRURtbmdxSm5LaHgyc1FKUXlxM0RpdzlrL1J1c25QMS9PZEQ1UzZHMHNzNkJlRFdTTUtneEJaODhwOUxPTkluRjNJbmdzeEJzClRjWkpTZG9wRFZQS3ZxMHpidkRyeFI2Zk50TXZSS1p0ak5HZWFzczFCOFJhQlZXY2ZxSy9NdWVYbjhZNEdQQnd5S3orbHc5TTF3ZGsKUDdlcXU0RWo4dm9kWkFVa0RoMkRRVzVGUEJxNUJ5eXpZL0haM3hxRHkvUWs4SkhET1RKWi9QU3hVQ0xrNE10bEpvdWJNNUJLd2hyNwppMUtjNWJINFA2S1JhZTBwMTNqTmdOMmk5L2RNRC9UY3MyWWJ6MjhkNkdzekQ5NS9BelNOdHpZc3NqcFBYckhhenJjdUhWL21CeEZtCldpcEZ1TytOMldCbFdaTE1IQTdMZGpCZWYwOGpCQWtzblJoQjd5NlBmY2Z5RlI3c2wxMnVuQXVlY3hqdWFSK05nalg0R0dSamlhcVgKZmRBSzduMC9XZVNMRlQyWmcrbXBUTHFjbmlCUVYrL0F2L0hNTm1CM2FwTGswR2xjd3BrR01zbkpZSk41YjdodDhhWDc3UWRzZnJGZgp4T2M4N1h3UndDaDdDMDhIMTRqaXNVdU9NUlpUMUp1cy9BcUFhWk5lSXB5MW9SMFF4bUhVNURmQUJSMlZwWmMzRUNpOXdCWGNmdWQvCmpqOWhHRlh3ZmpTeHArSStMNEtvd2N2bmdXMFl3YzdOU0c4QW1DL1ZOWG9samtlTndPWW5uYjNYVTdiYXcyZlVNajVXbjJlRjJWL00Kd3pDZnd3VDg5RFJXeUpmTjFHYmszUnBUUGlvUVFFWFAzaDlEOGZuSU5xZnBWSDcxNTlhK0pnNkF2bTJRMldHd1VoaWYyOUd2NG5CZwovUUNEWHhneis5ekF3ZTVZUzVidmdOWU5XNnlBRXJFSzNITVd4WW0vL3lPMFlaREcva0MrTzcxZjF4YkFVb3E4MTNkdndyMmJlak9TCkRCVG54Y0hMWkFoc2t3UlVPTi9PNHRTTmZXYURqbGdEcUwvM0tHVUwwT2dENWt3eTNiWVZLbjgvSDdsUXArdkxObHl2aTJ5ejVRYWUKUmNsYStvcmtWdmpzd0RkVnFBM2wwVitvZk5SYzBOaG9vbGVBZGs2K1NRMCsyckpaM3NpaDJkWXJmQU42NWRaUmk2Znc1SEE2a0hIRAp5ajZ5SkJiV0ZlQ0ptQ254YlhsYlNpQU5nazIwZVN5NlhlRnYvdllHMTJvM3pBMHlIY3ZweEdLdWdTVmVHTU9uR3RrRW5CeHErYnlDClIzWWpWdmtvSldrUTdQNktJclQxMysvditJKzlVUWNtblNkTEZucGxsOVRVQk8rRjNBWnI0bXY3OGFuMFVzY1ZlWjRtWGtTdkpPWUQKNXdyRjBlTFBpOFJQMGJQdDQwQXpodkRzVzRqOEt2MmRYSGI0M2krallTNjR5SHdFZTBsOVNSa3k2WEMzbEgvT2Q5SWkzcUJQTHc3RwpEMkEyNzV0Z2tUTjdublZJZzhKOGdMenZPNE1WSFlCSXJJRVB5R2MxSEg0azkrVmtZVjBMY1VZd3ZZZ0RzN0h3L1RiYTVuOU1saEJnCjdPQkxkcE9xYktWNENLNExaTHFYN1hRWHEzLzc4ZXhMdkZqTkpISTd2dVZOanl6cHlCeThzVFBVeVpsczVHdjJYUGlPamZ6Ri92eGsKRTlFejludXd0OEMrUCtobHQ4c1hGNkNZa0ZsWWN3bjkrY2tOSGd3cVhlRnhTZW94SEpCaWtOZ3FXMnhsSTdFbU1odUhoZS9HRWV6SQpsS3FnUjFzMmsvbnMxNExNWnhiTnN1VVJyMlJqL2xWVytwV3M2emZUYVZYR1pMSnc0bzBHYUdLektSTi9ueTh5MGQxaGlPS1NsMWlBClErZENhd1c0NkhXcGRhYVVtU2VFa2l5dDYzL3VWS1JVQnZ2THZwL29zUXNWQUlxeWVJUmgrZ2Jnamw5YnB2UGRPdk5ncDhKUDU0S3YKT2ZObTRzKy9LNTV4RHY1cGhVM2tKazhmdmJEaXVzOUM3elgzQjNZL0FmbnRhLzl5UGhneHBKNEgrZVFvdjV3TDVjSHhXUEJNeUdMUwphYkcyQVMvMjlybS9sMVRva2w4YUpyQjlyZnJRVWtyZ0RxRG5nbFpncXJYOGhlL1dBVGg3MlBjZlR3SXJ4NjlSeVVvYXE1bURlWEFxCmZHOFBQZ21HallGZGMrR0VaenRkTXYrZERuRGlRL3N2MERpSXdFQXNaV0tSbHU3dkQwYUVWc3RDS1dXZEF4TWpGcVppc05OTy84aUMKVFpDT3l1d2RPcGVmVUVkMEMvUGtBTG9LWnpmbkFES25QQUdYd3hrTkhSTHZ3Q29xL1daZjhGd0F1Tm5wVlNhWjJwbjVzc2lZUWVEVAp6TStqSW5iMDlNT3BkckNZRFhtckRhZ284RXNzNkNVMDBBRkp0Q1QzSkJOWjJ4U25vUTNBN1BVNUpZaGx6MGJlNmlSWWc5NXJkcHY5CmRraGpBWlN2UnVWQU9JRDFoQzNpZFhjQTdLUXRtMUdUcEFyWW5sb1hPY1puZysvWUNRaHhhNVBGaURUWkFFdzF3b3JUM2lGVXlKUjMKZStabHp4WWFkR0dLa1VxOXpCb2RITkxXaGZ2eHFmL0VvdzdZZGI1eTYwakdnbHdKK2lBekRBOFhJcTR6MUJmTnVQYzdlV0JueWc5QgoxTXRPTExkZTcwWWlCNTdqTWQ2MlBTbE9zS1NkYjhIVEVNUFVnK3g2UEllbkVtWjRXSU5sbTl2YXFlQjUyYzhZUzJsMVprZk4zMThRCkZsdHhhZ3AvQVUvR2VDQ0wwV1paYkd6c3k4MGFjcFFUMzM4MkczRGJmOE9jTFNSaEFkU0J4aTc2MEdJRExBbzJSZUs5Nkg2eHV3RUIKQjE2bDkxSjFJSVpWQzhCTStxUXdHNndzN3ZkTWNrMDYrVGE0R05pYnZOeEJFZDdubjR1eEVkcFEzS2xqUDhZcFI2QXQ0WlFlSFExbgpEM29vei80ZmN6eEpHN1RNUytSdzdROERIUmxlWnlMZFJURWJMUjFQOE9qYlN6cWV2SjA4M3Y0N0p1WngyeCtZYzlQSng1emEveUVyCkV1cms5SFF1MUpibmJIU3lXL0MyQktSdys0MXhHZGg2V3l6eGZaNGZ4S3AzNnlyNGViOWdENFlSMHhpczRUMGVld1AyOWh0SlpoYUEKeWQvT3JaazYvNGFSMDR2b0FQMkFPbUNmZHdMWUk4bDY5czJUQWV1eWNHMzRXQkJ6RnFkbjB6QWI5ZnBNMENBTWk5Z0xiRWViZVM2NAptczNDbmZaWEp4cEo1OHY1NWNmTUJEMHNVeWJaQ0F3SzFXclN4QjRXaTM4RzdERnliQ3RtRWw5dFlIWkdHbTZNOE95blFNdjNWMkRQCi9kNWxtK3ZRdTBBSmo3dVpvN05yS2xTZkFvRHR6Ym1kbEVKbFR1MWYrNUhXOEx3eFdNR2IrY2ZDSWhRMkpUM256NTl3YXU4cUFpL0kKdFNlVDVKVG1SbFkvc2FxSjBVbTBIanZTVHNXcnpmMllpWmdLS0hjQURPUXJIM21iYlpQQUd0OVpCbDR1dUJtZnphYXRPREYydmViVwpYcnhWNnZhN0c3QXVweHdYemFOZWVSNU16dVRvNjd5RTJSWjI1QnQ1TjU1V0VDMEVmN0V4ZUxNMHRScmZmdTg3V1BpMkk3dVpMSTZzCmJoTkFIQkIvYUEvazVWZ0l3SGFBOFRvNEF3TDJyRUN0TmM3Y1U0ckgzck90ZHFURjBTNjJ5dnpXd016LzNnVWhTMGpsMFR2WW9uYlkKTVlzbG4zZThtQ2dpVnM2ZWJCVmNQLzVwMHRPcjVySlJUd1hDcy8yQXVTQlpaUTBpT2NvemkwTmJlRVZnVE9XbTJaZHFHUjZYTG5xUQpEb1JnU0EwVDJCem1ING54Ky9ZWGVLLys0cStWTE1hMlA4VkJkOWtHQ3NmYmszaDlGRzYvZlB6U0dxWkdmc3JDSnAybnhMWTREVHRECnViclQrUlBaVkJwdTZJbUxvOUVOc08vWFNUdGdaMHUvNk8xRkY3bmdlOERMVy8yZmdXZVJiUldPcnZDK09rNC9BdC9ZQVp5ckpDN0UKeDBKeFBRSjVtY1JYajRXdm41Nlp4MmdzSE9UV2d6M25UdzVFb0pGZlptYmVRbVdkZnhkdCtSalIrRFNUam1vdUN0Ymx0ZS9aOHVZdgppSU9IV2Mzd0EvM1BVSEhTS29ZNHpTakEzSWVHUTNtR0F0Wk1oS1FmUXpFVjZDTUhzSmt3NWhJdmprZS9udXdtYlh3bFI0NHZBZ3JEClorSEorSTF4dzJOZ0R3ZUp5a3U1R1k1MzJ4TXdsemxKbTRpQTFXaHQ4WVF0d09vRE04OEpFSHp5WS9YaHVQbExVMnBSS0RaMEYrdnUKR0pBNnR3ZklVT3RZbktiS0FGVGJ0clBFMnNVUFMyenhEbnhrTUxJeWpNdjdCdG5XY25xQ1kveXZGSnVDSjh4N0s2Q3J3elJrK1RrKwpLdXYxR1NXNGJ3OFB2QWFlT3F2WlpMS1NOVitqTHAwUURGTUxYd3ZrRUYyQlU5aitlME5kRGl2K3NXUnlzdlpyNTZXU09Sbk1UUDArCmowcXdpQi9RSkQvZVVhWDhQL09qSWh5Q2dvTXlUQ3ViS1lDRExyNVkveWdWbUdpNTNFY3lBWjhaT0hXTEUzblkvbVVQcDM5dkQ2dWMKU3ZFajgwUFlneWZQWmEvVE54VEpaN015djJzZGZ2N2dkU01LNmVjc1VjZUxlWVZmZWlFL0RlYW1lNjJ2OG1lcE5JVG1mTUVickJJOQpHRm9BTW1vZFJKTXJlM0MwbG9DQkhzYUgrY05wT1grZ0t4a2Z3TkpBSGpvKy9IczUzendjeC8rQ1FqYmVQUENGRWZMTHcvZ0l2K1p5ClpKbjdRSHdQN1NNQ0NmNFZBdnZQOXZ5d0E5ejlBS1JzVHJFcVFrMkJXOERlNUQ4Q1JKNEhnSXo5NlFhTS8rRzBoU0NtODRjZlZFNDkKZmxpUC93T3ZLUm52ZG9CdEtRaytucWRMT0x6S3BvQ3E4RGd3RkxZTklORVpqRzc3emFIL09UNmNOeXZZTk5pbnJHSVlzUUdncDRlZgpuWEk1QUVON0VvajQrM3dDTDJCVFgxYXFLOFlQVTE2dDlDcGJlcTQrQktTb2N2d1NJRm1OMERvQWFySlhpMGkvR0VRMG9JdVF0WEpmCmphdFpWVUQvZGhwdlpyQnppVUxsQmdPMnZ0MXNwNmdMakx3T1ZzSkY3UURnTVdCY1doSENuVU9ERGhUbzRPejBzSjJNVDdYeGYrWU0KZ1lPYVJzMVRaOVVmNXJvcmdwRFpOVmd0eUUyMkFvdHhzNVB0dnpUc0dJZ0Y1QlNvUHBYTjF5UGE1SVdpZEg2N21hSGl5OG9NVVB6bgorNGVwTWRDdzA4ZzNkRkhlb29VRUUzTkhXQWZCdUNYU1gvekNxZ0wyaWoycXFFQ3lLNHpZVU5IUUlVWjE0VGtTY05NSUtoSU9zcWs4CnA4a1ZUWXAzM2ZmNXJieWlMc1pBR1lQZGhMNTNraE5kamVoNHYzN1dla2tCODF1NlhmcC91Qi9xRXlSdEtwRm1SQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJV0RBbU50RVVyUm5xNWdXNEN0eTlPakkvVUxwTVVrbEdSRVlaeDF1S2xoeEVNejdOVzh2ejMyUXovbGxyTU0xb3dXbnhMZ3BUMzhxQQpLWUtJME9KVk94TWh0Zm1BdCtlOGE3TVVkNkMzOHdTdTZIWnpha0lPMG1iRlNzbWlWR0VvMzlJRDBFWDNjMmsxemJsU1JPV3BJeTRUCnpWM24zc3ZUa0hwRS9XSUQxcklSaXJTYVdEL3BrMFBXa0FjK0szaUIwczE1MXAwVVZhL0J1NitnNFl2dWh0Nk54ZTRhZmNNV3hSb24KbHZFU2wwNXVndTFOSit5Z0JzZEpkVmFEdHhReHp3eG8vUHh2Skl2RzNLblFLT0pPZHlaK3pPK3VlOTNwNVNrQVB4SEJaQ01lWUI4MAoyRS9vUVNLUWJwMXloZTlZYVZVMk54L0g4T3dxeFQ0bDNJL044TkxvREpRZmpWNi92V213R3QycFZkTG9mTzdIako3bEQzZzArdllaCjNlZjRtOUZUN3hhTVhxeE9ZUDdIbmdPaER4bnp6a2J3U0J6cllIQ0ZWVEQ5TWtvRmN0RkFOTndQLy9WUjRnWUtpSEJQc2ZKd25qZFkKRDRmVTR5VHIyVDAvWmFxeFl5cGFUcjc3eUcwLzJDa2VQdnRZb1UvMld1Umo5bkdLdTdLUkRZMGxZR200ODE1WEUrQ3JoZVdtUzAzSQpGNmpGTElCaUZ5L1Zqb2RENHRnQ1NEd1Z6Qjk4bzZiQmpld1lKVThkWXJCZDJiQ1pEVWVZWHppd2h5L3NtQVN3bzJkM3FtUzBvWW1qCmRTbXNmUDVqdEJTTTdoTy80TS9TR3Z5NlZ4QWkvVHg4MVQ4YjBraExrVUVvWGhuNEpKRU9MTTgxZzFXRWxrTWEvcW1Xck5KSWswYkgKNFloYkQ5SklYL0hQb0ltSXV6aWtCaXVIOW1qMzFMMHlTRU5MeDlqZUswb2pEVG8vM1VsaUlUMVRFemtJR3F6bTltNWRrNW9yUnVhcQpHUm1rWWJObGMzQSt5aUR0RFREeSsvbU5RNHFLTEZtMEpXUFNoajhOVzVKSVMyV2lKVXRlb3A5cWpSQlN3SXVUb25CTjN3RW5mNTVUCk5ZaldlYm1xamw3Z1k0MDdBZExnOW9LVmFsaU9SdnBxdDR1UWhrSi93eDJIbE9Oa0N1M3c4TFhjdEdTUVpzYmhDR25CSlpFTzBxT20KSE5LeXdXb0pPQktmMG5OTkdyK081dVc4S1kyMGtYZW05cGEvbWhSU2QySWRUM0ZJd2JvSVdjbVY3bWRlcEpFR2V6Mk1qR0hQa2toTgo1Q0ppYWY0UkwxSklEVmFNL1BvaVplWWFObHRYbTNwZUR1a1lLM2xHSFdta0pTeHJuenNpUFlUVVlCVVQrR1QycEdta1BhOURST0QwCmMvQ1JKbS94YzBVS2tQYVRXQzNpeFNGU2x3aXB3WG8wbGVmYmNIUHNKUURheUU3TXY3V1AvbGdHYWRnY1djM0lnUnpTQWxaM2ZjVVEKVXNoam9ybFc5dkhNNytHNUtZbjBMV0VQeUNLdHp0OENtQlJTcVBtREgxN3NiZWcwU2MzMWFLcVc1ODhmZmFkREVtbkh2bG5JSW4xYgpOa1lUaE5SZ3ZaenJSd25yVkhkSmFhUzFnTFZOWnBLUDBraDNUeVlwcEVBblE3U2RZY2wwa2lId3h3djJucTRXcEpIV1U4WGhvUEgxCkpZbjA2MlZWUVVqaC9uSTUxOTllYUViS0lQMk1ZbC9IdFZjYTZmUHY3dThsRmcySWtNSlVBb2gyV1BGdVpBbDhzTDY1alRKSWUyMnMKK1BQM0pJazArdXcxR1ROZlhxREhBTnI0WGl3MDUyRmtTQ09kQkp3aW9YSDJhMk1YUWtyWVU0NnljS1kxYk9TS1p5RlNENGNVWUlGbwpBZGpmUGFQMEh3OWlwTWV0N1pGR2VrcTdSVE0xZm80L25CVFNYQSt2Q0JXaDUzQnNwNHdBQzBEcnU5UktGUythSzBDYVAxMm93cklwClRDRk40MVd2U0JGNmRzRm5hcWNKV09MNUtrSUtzZEJvTFlmRGVMS0JTREVSMHNNaE85OHkvUHRrRkNFOWhuN2o5RTZUampkOEl2S2EKdHZOUnkwRGJEL1B4TUN3Y1ZMbHRHMnpqc2s5N0RmeXZJL2QwaVpWSDFqUDM5RUx6QTlWYnNNbjhHcXlCeloxbnh2VTdqNGllaHFQNApzRVUvUGE2aUYxSVozaXhOWGFubmxGSjhyY1EvWlo5R0NWZHpKUDkwT1I3WVdZcGRQczhTdHY1VTltbk52VWtUOGs4bkw5OEo3cW1JClltSHppMms2S2N2OE9scTJsWlB0SS9YMDI3NlBpWDdiZHY4d3h1azNib3BmVUt3OWVYcmJTRDJudEZ6QnZUcklQbjIzVHZ4RythZWYKaGZnalF6R0o1eVBySUdLUmZmcDdldDJWWlordU9rU3V3VDI5b05qZmlrd041SDROaHRSSWhHU2ZQaEhCVkZlZVl0YnBadkpXay91MQp6V2lyZkxwa254YXo5Y2xjOXVrVGtUYmg4aFRMR2dtTE15N3pORlRHaW84dVpzNXhSMEwwMU4xcUhOUDAwN3d2S1piS2NtdFVjbVc1CjU4RmowTk1VZW1CNWJHYi95TlA2WjJSZHc2YzcyaDBsaHlGSzllUzJ4MmZxazBDUEVTY0w5RER6UnU5VHJBYzh6TjhXL01jSHZ5T04KbmtJekQvOTVSLzRiNjcxUk9vTEdOMjdtR00xM01CSDJ4MWN2cmMrQm55T3d4MUxtZ0IzODhPa1B5UWIwZEhnUzRhOUhOM2JneDNiUApRTFdhYkFEZmQ1TEZaL2IvUEU2Y1FEdVppb2Z6eU9jVnFOdUR5V0RsMENKUFJ3WnAyQXo5bkE5cHBNRmVYeFlwMkVSK2NaRTl4cDhyCjhuUmtrY0l0YnlxSGRNWkhHbndEUGpJUGJmUTU5OFpET3JQWnpCeFNaUDJ6U0FNaThrTHJuNTFwYVMxQTZ1d2g3NVdQVmtEZ1IwSVcKS2JMK1paQUNmeEJZL3dNT0taaUxZSzVmc2tnQmdZOUJlYVRRK3BkRmFyQkMrMzhwUGRlazBhZUV0R2FYUllwc0NnNHBsSDBCV21oVAp0QVNyT284eDZORW5laUdjK2Y3c1Q4dDdnL1BmaGkvN01tK0d6ZnRCc2Z1aStsNW9TZk1kclMxeVlNNmZXVnBiWG9qdXlQRUhxZFBrCkJXaFM1UGxBS3hmYlcwWWs4VEMxMGNQOWs5bzVaaTNhV1ljNmlmTDNVenRuY3NkQ2RDQVFxVmpaOG90R2tZcVZQZ3BBY1kyTEVIT0EKVTAwMCtsVFJTdi9qcVc5cEJNZ0VaaEN3dGlVWUQ1amM0NDU2U1JSOUFtb3Y1MS9PQzFiMm55YmZZcVpqWmkvc3l3V0lwY1NmN3VncApUY2VVd0pEYnIrQUxHelJvenk2R09wVGRUcXRqM2d4ZWJVSUNzaEUzTUdEc0tXUzFvbjhnUTc0THZTU3BRYTFpRmRHZytFTWFudTJBCmRlc2V3cDdHZUhFMFVUZ1FrUnhveTY5enJxcEdkUGdQUFhqS21aZVluOTBvT3orRGxac2gra2QyQlpuMWV6T3ByNStablorTDVqR3AKR1VManRhMUFMTzNydDBYOFNYa1dHb21sQUF4MzVYNUpXVkFHTGV6T0VDdmgxY1ZaSEY4SmRtU0tzMHFmZS8yVWw2UTdNRzc2TkNmZgpUSGtpMTQ4OUtkUGRJRThzb2VweFhxcWVRVkdvZWdLeXFzZWd4cnJGejhxQlQwQjJ5QUlDMmlqVkkwMjdBYnlLaGlHd3pIZzhSUS8xCkQwMDdmQ05OdTU3WEtLdTI1YVFTeGVNa3A5WXo2WjhhZnhkRGt3dWtPNjI2R3FsTFZSdDltaUE1a0lKYk5DditMc2FiMWZ6Vlo2TlgKLzBLTkZnR1d6bGJYaEtRMERPQWQ0TTUxZWJSbHhaRFA1eU9uRFF5dVc1QlpKczhPSDF2c1pUUUdLczUvSldFdytWMTZ1WFUvTXB6RAo0MlFVMUpFR2htc0ZKZ1VLMFoxM3l1TzZsTHN4cVZYdWxLVU83SlZqVS9lc3VKWm0zTlBHUGZDZkR6ZnZrT0tDTFlCbWRCU3JVc3NKCktNWmZVUGdQV0ZBdUVIM0pHMkIrckJhODVJMlhCanNrM3JqUVhFNGx5WkdsU3BPajNDUXoyUHpVOWw5WVlaZEx3bmw4ZGZmbGtzeEsKYWxhWVZ0V3ppaDROVnRtTlNZUE55TDBNckptUGsreTJaTERxV2Q4U3BFbFp2L1VrSmZ1emtsQlBTeENydnVVMlhvVWhuZEpQc252bApTNU1lanhhVERneEozcUJqbHM1ZzFiYUN3TXRYTkN6VWJIN0JDbTZzaW9hRmp2VXJ2ZjV4b0NoT3ZnSFkyMGJEdU9CVloxcUFDVGNVCnZlTmlUbmhwWUQxbEowYlBKUGxXM2MwVUd4N3VTREdoUnRNNXJwMHdEak9LSEM0YzExUHFlS1YxTERoL0FlTXBTem1EY2dhdDVBWk4KNUxwTG80b2U0eG5ZMGxKNVNwdnVKcFc1N3Q2aXoxR216bU12VnJJTWoweHFIRzJnSjY2Zk9qMlRUYXZ6d2RxV1l1cWtqdXkyckJwRwprRFlNeXlLbElDa3Y2c3VVT2lxN2VLS0IwSng4T1JRVkxhQnBJQ0xiOGpxYXFJZzlieUNVait5VzJhSVdaUmk2L3REaGsxT0hrc0lrCkl6YTNoL2c2VG55OGdEYjRWSUU4WDlTQlFDYW9BU3hCbzRJTkk2aytaQVNrb214MkdLeDZCbVcrVWdFSXRTVVV1YStUVlhsYjFxb0EKS3B3QzBPcnZ5OC9Qcm9Ia0JtMUVGOWdLNnZFTXNTWFB4ZnArSy9CUTcvMGVURlU0NGNXdlk0blRESUpjT0VuSFI4WW5CN3kvREdqbApUL3JFU29sWTJrVmMxdTFCWGhJZ2xrNFJGeENMRlhIMGk0QWx0dklMQmZ3SnprVW80cEpldDNwMENYQ3RTVnVFUkNtVzhDUU95WXBICm94U1NGVVZJL3A2RUZyeU1VNndla2dWVDR3a1N2ZnE2d3lSUE1DK2hyalc4d1hwSjRxRThuWVhiOGhYaERjQUhld0pOQ0dXcVhLeVcKOXJVUzdha3ljUitEVlNsSzkvY0VEM2Q3TjhWOUlGblVZMzBpVlNBVHI0SFVDV3ZpWko3ZUZFUWFkZ0pUT25NV205S0FEK1NEaWJSTwoxbUJNUXlwWHhhYTBIdHBSOWhnYWoxVjVQRnJqQzRGME8ySVhjUVRQRjlPMUVWWkZsdkIxOGhKdk9KV25wczduVlc3elkvZVhLNkxSCnU2cDQzNU9ia01HcXdPbUFkNFNiM2pVS0lOMjJoZ3dxYTY2Tk1FT1ZJTDFCdE5YSjJiS0FPcUtOVG0wZjR0dXkxRng0V3gwOHJMTHoKOHpmZ3JNQjNXcGhCVnVwNG5Kd0g0L0hwaTNsZnpybjdKclhiQ1U5Rk5SOUJBbUJ5OFZhcGFDdmxXY2pGV3lFd0hjSW43UzhCb1RGWQpiejZrUUt1bXZPVVpOTU1ST3BMNlJrT2ZpVk53YnBWQUNncnJUWEpRR0oyc0I0NytmWS8xOXlXQUNVNEk5VzJpd3ZOQk83SXVQQTZoCnhabEhhYXAzT1dISW8rUlRnMVZkRERWc054QVk0ZE45eGlkalJNQmNUcGNtVXZMTXovaGVzSXVKTmRweDVielFhTWVWK0FCUGcwYVQKakpEa0FXRXkrMXMxV3B2VGFJejNxc2VDRndOVDEyZ0dqU2RJRU5qMUdvMlZ5bEpuZXdlTkJsWk5TcVBwbG4wQVI3OUd1NGhkVUhCdQoxMmdReXUxbnJ3aU93bW1RSitkZ1QzSDhCcXVVTlNEWWhEcGJKUSthZjNRb2JhTUVQVTFodmlYd2VTNWk0L0M3V3c5Z21mM2wyNzZYClYwTWFMYk04a1BPWGs1UXdVeEY0ZldvV0FPc1lkU2xaZzFWV3pWNlovU0FVNWc3eXBRV2UrRFVHQ2xnMVVWS1RuSVpSaDZQTnRKZUYKZ3VJd0FNN3RLUkFJaW94RExUcDVWNGNqUEhUWEdGNldPRTFBd080UnE2YjJRakEvTjdRdWhMc2grTlo3aTMzUFk5S3hxWG04MmVQcgp2bXVOWnZGaUY3Szc0YnN1KzE0NUJndUIzVzdmZis2bDlrSzl1eGhjTmYwaHJjdGRETUs1eGI3blFXSDN3dXQzTVFSSHdyNlhnc0o2CnJ6Snd0TzZHeW5zaDBqQ2YrNXQzUThGZU9CU2ZFeU1zNE51N3BDTkIvU09aaDBYdmxZTGtLUzROUTlZV0dCNFVsb1JQU28rRzA3ZHUKOTVaWXRTak9ENERkS3QyOGNVbkl0bkt1dFFMRk5KbTd6RXBDTEhJZUVWaExueVk1VnpnOXpRTjZkdndLa1NzTjZYU2lJY2x5Qk1ydApVUlV2OGNhVTkza3Z0cVc4ejYvSnI5U3dNUkc1N2t3MlBVOCtjMDNHM3djakk3U1JVb053VFk3M3k3WUZ3R1RQYnRob2o5YUVlZ0FzCllFbFVhL2VJa0FDS1JmU1pHREk1aUhBbGh6NU5NVmdLbUl5dzl4U1RieW1PTUREeGUwMkQwc2dSRjhKRjc4aVU2SEw3V1NwVTMwaDYKRnZRYW9HcTU0OExvM1RTR1JrOW5VRFI2czRFQnJKc3JTbFhRVVRlMzNGNUR4OS9GTGl2b1JCVkRWOWZRS1ZmUUlaMThoeG82V2FTbwpnazYyV2xCbkRaMXlCUjIvV3ZDV0dqcmxDanFCMVhkRERaMXlCWjJnV3ZDR0dqcmxDanFGYWtGZE5YVEtGWFNvV3ZBT05YVEs3OUcxCjFUZlgwRjBJcnFDQ2p2VXNicXloVTY2Z1EvYVllZzJkSUNGWm9jTHMxVTVLV2R2eU9mRHlsVUNpWkJjTlE1S005QmJVRTdkZDJ1cWwKU0pHUGZIVXliRUZzL1VvRUI3UkdlajhLd3QxZTM5THh6dmdLNG9TTnErbVVjQW5ZVlZncnl1N3hEaTNGWVBQZmVVY3RpQ0k4NDFNQwpwcHlIcFcxK0tOYW5Wam1uZVg2aXlOV2x2R2dudWwvL2tHUXFIMVVpVjBwRGtpcVpnM1BSVlRTblNkY1VSYWtnWEc2UHZnS3FrNjVVCkVDcC9URElaUkgvWVdDNW9qRzRHdXpsZTFmT2FsYWRtMEZqc0pzeUUxQnNZUkp3TTF2eldpREZWN0NaM2JDUDBrZz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJMUlyZDVQMVQ1UU1IbnJZc0tpYURDRnhUTlRla0tLcG1FRlFLYXdNbVRNSENMMDlzSnNSZXJmSlJtODRhazdxY1hpU1ZjbTd2SkNDZgpRcW1yeEJUVnZ0VTFWaDJxKy9hQVdGSm4yYXc5ZGhrNlV3c2NycUk3VVpnRS9MWXRtVFI3eFlsVlNkYnNrcTBDNDFsSzRqb3dWYk5MCmN4M2ZXUzBIWGtjZDMwU3Qvc1VzQ0ZySmw2YkpGOEVvbTlLWE9mRDJ4NlZaYmxBWnFSSk4rZlZUellIWG5FVXdLd2tqbUpMcnA3V08KTDNwUXE0bFJZZ1poZGpvRWRyY0swUU4zOGlGWG1hSUhtRHJIYTZlWU1NQjZJOFZVeTBTMVQ1TFRhRmRSVEJqNEpYTGRubGVZNkZRVwpKZFpMVkhKcHMyVXZZcjZYYmhZcjZrM3B1S1Z5dlp3SWhBeUFsVW00STB1QUdCRURIUDR6VXBUdXNnWm5qL1g0Vkp5OVJWbXpzeWNIClFKeWplQVVJdGF0UndEcXp0MnBvSzVXN2FvV0dtUHIrd3BnMDBtSUJTOXpVZ3d3R3haQTByRXFUY2VJdTJGNnBSczZnVXVhczRjZ1QKVFVqNXloUERoWHVsWUVmR2p4ZXAvSTdDU1FQSmVTY2pjcHo4VzlFWDNwRndsU2hMU2FWQTdrTHJ5RmRFblNSMzh5dnNzWXBXaWVmawpYZFllKzYzb0MrL0lsOW1KTTRpdXB0TlNKZEpnRUxrUzhpeWdNeUlqR0pLZ0hoa01pdEFUL2xBWWtsQ1kxWGN4QlRvRnRRNUpPVHRkCnZTaE9hVWppdXp0OG92Z3ZWWkowajRqTUU0ckkzSmlsQml4aGk0YUlESDNHcDFLZVk0bjdiTGRFWkhqKy90UHRFUmtBd0tHUTNhR2oKRE8yYWlNeEZ0ZUR0RVJsWWhpYUt5TWhWcEtyVjV3VjFSV1FrNC94UEdzcHp0Qlhud0JJOUlIRHFuS3d0ZlErMjZzQ0V4bktWTTVibAo4OGExR011QmROdHQxc0FNeWpXSnUrcDlNaG5ndXNRYjl2c0VkY0RVNGc2Vm5GNHRaV2hYSnJEejl4ZFlRQ1lmWGRKUlBuYVJ1aUJaCkxhaFdWNmM3YWZZeVF4WFYxV25NMTFPc3ErT1ZqaXBVQ3FzSFFhdUtsMVR4cEpkbld5cW02cjFlM2tVS3Y5TzQwVEUxNzNLSlNmZXAKaDROWTdwRlRwMXdQcC8vK3NXdnE0YVN5b0YvLzdsMFBkME9kaFk1Nk9LVU0xZnZWdzhHbzlZMFNxS0VlVHVKR1VOa2lydXZyNFFUWgpVTXh2N1BldWh4UGZPMHBWeE4yN0hrNzFsb0M3MU1NSlRxdzBwRnBlVnc4bjlzWGtqblZnSmR2dGxmVndnN3RiVGlRQUpjeUpsTE10CnRlUkVkcmFhY2lMVlpQKzRDdHhxQnVSUmdzVHQxZWdJamtkdDlUWEMwVkpISWd1RnNzY1FuRHRVY2wxa01pamt3S3RyTkZoY0p4OFEKdTh4MzV2V3lrY2w0dHU5ZEZ4blA5cjNLUW9pRVVEYmEwKzNjSW9aYzhSRXZxbkNyR0FKZ2l0ZktTT2t4V1RIczdiU0tvWUkxRHVtdAp6MStVWkxUNzNBYU00T2dUSDVsNlpBRG5Mb1dRQmIrMlhVd1ZqdnlWd0RLM2FjbWxXVjllQ2F4Nkc1b3dLaTI2cmRIcHVZeGh3ZUl6CjVZdWRWQjFxdGlJVk4xMmJJTUticzl6RndsZFZwSTVOUXcxRnBCb3JVc2VtaVphUWdVcXAzMTBxVWovMzk2bEloWER1VVpFSzY4VnUKcjBpRlVPNVJrUXJoYUxzR1d1UVNTK1gxSVFHUnZ6UlZkNUtSMDB1dnZsQU11emVMb2FnVVRscVAzYnNVRHVYeksyYjAzS01VVG5KZAo3bDRLZDMzY1VrZ3haZDlkaDE5NVF5a2MvdzRpVkF6M2o1VENTVVFWL29GU09PbjRtRWIvcktka0dQSlZBZi8rWktYQ3A2VnNycXFXCkcrR0Y5bGplcCtJV2FVMzBncUJDbWlLS0dnTElFSmo4elhZNmJaaUxTNGIxSGk3d3F0RjdHbzl3bEc3bkJhcGNhc3Zqc0tnWE40dnIKNmo1bHI4TVJidzVNZEZSaWUrRGtGM2FOODBqaG85Y0F0YmhNdlN4TDY4NTRXRERQemtVeVpza015RmJxdFpqeG4reEE4NU90ZEtTSAoyb1lYK3NWREpsc090NTd5T2Q4MG44LzVxN0FKd2R1TzJZNnNhK0dRNllpVHNCWkxxdW9NZWtsMGpkS0hmTjFadEJGLzViT1hzTmd0Ck1YMnA4NFBQUEtTaHBjdWFORzdsS3V5Q3ZhNVNzZHZNTDRzVUkxczVwUW83Njh0UGZTeUhkS1NBdE9TTjhaQ0thN0hpN2lNdkNpY3UKZGd0Mmx6VzJNNkdvQk16a1VDcDJ3MzBpcE1KK2ZJay91UXE3c05tOEQ1OC81WXJkUHBTcXp2NlVLK3kyclpZc1VsdHR2cHpKSVowcgo5K05yZE9XUkZwOC9TckxrdFd3Q2lhRWMwb2F3d2c2dEtoQllldGJvRTgzbmNZM3ZKYVRlbzZJS2dqZURuelZORUlQT1YrbzlldXVzCmhTVU0wV2ZHUzBxUjU3VjRRMVdLSFd0SXVSVmFzTzROTlJmQkdkR3JiWHVmMGg3MURGVngxRVMrajlWZXc1QjQ1MklLZzFKTFRsWEwKODZDODEzdDJrcE5xT3lKeHA0cUc2SkpTSnpsZFViaVBndVlVU1pWcVNIUW5wSTY4UHJVbWNvcDVmZHI1U2FXSm5PejhwUHErcVRVYgowVG8vOVY0RG1vbXUxbWRFZEpmYURmM2p0TXRMYVM3ZmlFZzIzVlZyQXpybFNPODExWFRYeFdIMFZ0TkorUUZNTDg3N1ZkTnB2Qi9tCnhtbzZxWmlnV0Y1dXI2YVRxcVc3dHZKUnZwcE9LaFl2bldsL1N6V2RnQ3kwekVyZVAzWlROWjBVS0pVYlFxNm9wcnR5UjlaWlRTZDEKVHNQdWxYZXJwcE9xcGVQNysvZXBwcE9xcGRPWTI2T2ptazRxMXM1MFlMOWZOWjNVNnFKSTcxMnI2YVNNRzM3dTZIMnE2YVJxNldSdQptNytobXU1eVNFdXp2S1YwYlRXZGxIRnFzTjY3bWs1cS9TU3lvVzZzcGhPRFV1MHBmRlUxblp4dGVkOXFPdTBVdTZXYVRnUktmQ1orCnAycTZxeWltdTVwT3NjYnFidFYwMHJYVjk2Nm1rd0lBc055NW1rN3F0RVNVQTMrSGFqb3A5U0QwWHU5UlRhZHlNbktuYWpyMS9lVWUKMVhSU3hPQ3M4WHRWMDZsVmN0Mm5tazZxbGs2Mkg5L3REcUNYY3dBRi9jVjBYZDBrMzhYcnNrbWx1RGVIeHNLbnZZcXdDNGdmM01yMQpzcm0rWDkzRmtFN3dsT2ZlL2Vya3JRdHRkRHE1N2Jyb3hGRkprQWtKYXpKVkRRdU5MQ0FvVUpDcGVwWWJsR2hJV2xXQmh1NXl3b09wCnE0WUVLUVlHcGF2dHN0S1FwQk1wWkRXTUFwMFUyaTdMcUV5NGl3azlvalQrZEJSNVJBRkxiS2ZTMkZ3NU1zZDJ5MUpxZEhkem16dmUKUFZjYVRmSnIydHpKZHBlcmFxcFYwdGptVHE2U1Mxc2huYVlFQ2VYOFpLN1IzVzFyVmVydHRIU1pVWXhTYVdwenB4cFJoSVM1dWMwZApiY01vTjdxN3VjMGRWZnVtMHVoTzIrSFJybnFIZTY0QzZUYXV2SWphNnl5cWQwdFIybFU1ay92cVdoNHd0VWVuVnY2VVBlV0JEZXBVCmN3L1YrQk9XMFVIbldURUNyNm1RVGt0R3MwRzl3bEEraVVOemZTSEFvcEIycUNPSkRGSkhOdlFuNUdSdEhiWUFack5kWEU4RUwwMlYKbmJQVTNWQnk1ejJsMTc4ckM3c0UyVkNBcVZUeXdUVm5Rd0ZRcXZsam1yT2hBREJ0R2QzS2ljMUk5OTJsOHZIMm94RFlVVkRoT25CNgo5VFhDMGRUYlZRb0tMN1ByN1I0U2lLQmNWTEpMVmdxcjE3SWpZSm9LYStWNlFJZ0xhOTgybDRXMWI1djczUW9JZ2QybGtUSGlNVEJhCkxjcU12M2ZKa3JJbFJVclZmcTlLT2RTdXl5TmRXSWwzbVVHdDZJbkw1VkRQajZ1N1ZLYXdOeC9ydHlRdVFkWE85K3BnQ0I2OHloOFIKYTViOXRxNUcxWEtuYjdEeDJzM21CQVZGS2F0VEI1dzczQkpBd2JtMVd6VUZoUkZDcVJzTzllV3F0alVVTXVnNjRYVzZKY1N3bzZHUQpRVk1FL3VZT2QweDlwVnlQdXl2RVVDSzU0dHErMWZvNjNDbFZQdDRnaGd5ajBSM3U3dElwVDdXZVNGdW52RnZyaWRoT2ViZUxvVUtICk8yRmRrcGI2a0dzNjNDbjFlNFU5N3ZSM3VOTjZxem1zZnJxOXNQWnp6NWs1Y3Q2cjVzSmFBRXpkekRGb01YU28zblRYRmRhS0t4OUQKdDhhUFlIMWhYYkljV3Q4OVZ3ak9GWHJ6NG80SUNPY3U5WngxVEpzdnBncEh2aFpXVk1Sa1VMdG1BclhMMDFQZkxsWEV4RDhWaFFyQwpjeUdHY1lmS1FtaUlhekY5M3pTV01Xa3BZckkvRHNTZUtHOFgwMUxHSkp5a1N1eVVBOFd1aTJ3WlU5eWhxVUpkMFcxbnBUTHUwQ0tWCldvcVk3SThic2ZGOXJWL1oxVlhFSkpkQkJIc25LdXkwK2d6RExsM0RlOE90L0NMRFVPS3l4RzZQNmdGeGp4clh2RS8rVmpIb3YranQKU0tlcjNTTWlwYnc5MXJ2ZjFWUTlkUHAycHhyWG51elZWUHB0bU1sUlY3dEhsVTU1L2l0clhIbnl5YVpoYUtoNlZxOXhCVVBTWFBXcwpWT05LUjREZ1F0UWkwdmdZMHc5V3ZKVWZXNFVWbnMvNW45NEw1dm5UbThGYVNMdmZXby9ia1RzTVBwVmVVWFVmMmYwa1o0UTlaU3BRCkd3OEs3ZkppeC9RblFSSGVjN3JKUnlxb2h6TllqK1pPNzVVZnFoTDJZWXZuUDNveTlYQk8rU0s4dzNrVXg0VTZXVlNHaDdua2F2L0MKWmt1azZmeVNLOEw3bEVVSzVtSWlkd0hadVdJbGM3OHRpOVJlbWZnV2NuM1luQnhTdHBLTEkvQnJpT0FoRlphbUhlMFJHOWRITUNDcQpjblE2MGg5ckthUUdLeVN3dU9lY29BeHZMSzc5NDVPM21ueVZRUm8yVzRQUGhSRVhneFZYeEEwVmtKWXNZWG1rcFlhNUw0VVU5WDJMCmxnV2xsV0trVGFVK2d0V09QTkppc1UwS01yc0FXZ3Q4N21FLzBVV1laOWVqWDdqNk11OEY4cGpzZS96NlNtemtpbWMxUUhUSHQ2Y2kKdDAyQ09mZUNZcU9UUGF5aG96M0N6VE92RUNkbU56cU5hWk9BcUNFbk9nMFNkREZUVDV6VXNEY0QySS9pd2liVkNJbDhTZEpsYXBYcwprQ0FueXc4cXI2VzBTYjJ3Nlhpdnppd29vS3ZTbVVWckpLbWduRm9sdTNRWG5Wa0FnamM5S1doS1ZYZWlteWR2cUVwVHlkQ2txR1RRCnhrK2lReSs5ODJPajFyRHVUbmVYUlpraFhXUnBpZVZGTTlGMVpXa1pyRXFEa284VDZ4c1MwSmJ5ZVZyMGVDNXlZMFhxcXZpWmNna1AKcjR1WFBWT3VjeVVBN0lxR3E2OVZZckNENHIwdWIreDVqZHB1T05SUWphUVlYdFo2eWpNbzNuSVRMVmVUZUhGbDNGWEZidEpIMXJydQp0UjRVcjR3c0MyL1JoRldBdDE1Q0szVlhuR3k5bUpyWGNubFhuSUlESkIwZkV5YU5TQnl4amtsZC9RN2tOUXg1Tng5NVRJbzF6TFduCjNsVEJuWndjb3hNcjlmWjFncEdKNC96cUlUdlVqMDgycWhMY1h5UVFyS0lIL2ZhSVRPOG4rMk5YL25CUVh5SFpSVCtMRzlxeUtWY3kKNmFxeGl1bTY1NEEzSkZIOXk2eWtGRHRXdGNZRlErS2w2dE9uMVR5cDFWa0t1TEpvS09YazMzT2xVQXFvMXRKWVpmMjRrL2RaU2IxUQpSek16aVBvYVMzYVowUUZNcll1T1hWeGRxd0JNdEt2Y1JqSFZXaDd0a3hTZVhONUlNZFYrT3Jvb1ZndCt5Z0M3S0JlV3NnNXBpbDFaCkJhaTFCbER6UFNSeUJXS2FhZ0FWc3RNMVZBRnFyUUc4akNmcnFRTFVXZ1BJditGUWZ4V2cxaHBBRkxXK3VncFF3Q29LSHFZNEQxWmYKRmFEV0drQklzZXVyQURsNkt1c05ZWTJWM2lwQXJUV0FySTk4VlJXZ3pKQXVhZ0Q1NTVYVWVDNW5kWHRUUHUwZDJXNXB5c2VieXovWQpsTzhpcXZDUE5PVlQ2OGgybjZaOFZNMklzb0Z5ZTFNK2cxWENLcng3VTc3TC9zai9SRk0rK2Y3STkyektwNmwvNVMxTitmaFJCVGlvCnNPeWdhQktwbFFiTGQvVzcvVzZvcDN2Y0RhV3hyNSttdTZGdTd1dkhtOW9kN29hUzYrdW5MMC9wMnI1K3lsMzlycm9iU3FLdm4zSlUKU05vVDE5L1hUNXI1Rk8rR3VxS3Zuem9uMzZPdm4zSm1DQnU1dXJHdm4xb2wxNTBDdW9wZC9ReFdYUUZkMmI1K3lsTVR4UzZ1N3VzbgpHTWhGVjc4ck9vQkk5dlZUbnBCVWh1bzFmZjBreXhHVmJqWFhUaGpObGJLU2QwRmYwZGRQK2VZdjlrejh4cjUraWh0ZEh1MWlkK2pyCnB4d1cxblVEbFVKZlAyVlhWeklMK29xK2ZsSmxrcHpvM2RhUDd3NDE3N3I2K2lsRGdYSCtlL1QxVXo1UU1XaUdjMHZodTdnaTlkcSsKZmhLbUpxK3JINzg3QTNaRFh6K1JHR0xDcm42Q083dDBsNmRnYkY4LzFiclh1L1QxVSs3cXgzTHlqWDM5bEJPdWVSV3BOL1gxNCtxMwpwSGhSZE0vVjFYMzlsQW1JTE5nNzlQVlRrTFhqS25DbmZud3VaU2lhKy9HcHRKUFQzSS92cHI1K0xCUko4ZEZielhIUjEwK2g3a0UxCjIzYXV0Nitmc2lVUGJ6eTRSMTgvdVQyOGMzbVNlRjM5bGdaem5qbEpWQk5EdGI1K3l1Zk53aXlDNi92NkNha3Q5Zz09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJRnEvdHg2Y3ZTVU8rSDk4ZHhJZnQ2bmQ3UHo0dFJVeHF0emRjNW1yb2E4VW5ya2k5cmErZklMQjkwZFdQcWhpNnZhOGZXeXFsMUZmMAo1cjUreW1hT0RJL3A3dXVuM05YdjVsdWI2TDUrTjhiNk5QYjEwMUQzZW9lK2ZzcGQvWFQzNDd1cUNsZWtMUy83K2wxZkRNL3I2c2ZECmNsTmZ2OHRRTXIrcm45d3RaM3I3K2ltbmQ0bDJzYXY3K2lrbk9vbGlTbGYzOVpOWUYxNVhQK1Y3NGJUMzlicytiaW1rbVA2YUp4bS8KOG9hK2ZwemlrdXJxZDNYMm9LaXZueUpIOERxQTNOYlhUOWt3cEx6WDIvdjZLUmZFMGp2eXpYMzloSk1VZC9XN3NNYzAzMlFsN09zbgpid1JSTm96S1RWWWErL3Bwc21GdTd1dkhYOG5MQXh5RjZsb1orWlR1NjZlOE9TaFdjZDZ0SUpiYTkvMFMyME5meVVaN2FVdG5mSWp2CmxWcFNOeXFLOWtyd3JYeG9Wem54WGxTMktPQW1oc2U0MDV2VTQ0NWZCMC9GcG1oVURzRU82ZHR5aE1IOEwvTXdTODluZ1NkYU84TGEKTitLNE5JSnQ1Y25vL25pMllQN3VLa0s5Qk91cGpKWjZxdUxESEJ1amYvcXhDd1lPeXljeXRmNktOZG91aC9mUGFjL3RjMWg1OFp3MQo3OCs1c1BGelBBdUFUNk9NTlJSTmxHMzFsMzB6dEYvMVBneldTTWdYbkViclpOZFg5UjJNb1ZvcE9NbzFWKzMwN0swZWZsKzI1cytoCmZjY3gvN2E4WjUzQndxK3AxYXl1NHV0a2R6dFBPemI3WVdSdlBXUTI0V2ZqKzNQYWJnazRTbUhyOTBlbDRqd3Z6Ui9CN2VjOFRzcysKcXUxTXRWdHZIYVBQUGNnWWljVys0MDRHN0JtTXpGVnpHUGs5ZmNKS1lWdnpjQmpGSElkajlMMXlOQS9DazJObzh2SEtWbHEyM0k5Kwo3N3N2VUl1Wm1MSzNYLy9oK0xtRnplWmlacXEyK2xLSENPcExFLzNhTUphZE5uYlFvV1piUU1KK2t1Y1JiblZsTTdVbktXSWhZb0RwCm5teHdYUUlXbyt4Y1VVV2pZMnlmdjVvNy9WYktzam40U1JzUlhKek42NWx4Qml0Sm41amlVT1Bac3dzK3czeTErZ2JWSkJxelpLdGwKeFN6ekdmTDNYN2RDazMwbkVoOHd0ZGM4cjJpT2k3ZnlwZ2JVbWhRZFVtRnIvbXl3RnZya3ZJc2FhT2EvU3MxdStEay9NMlg4cCtSVAp4bitjSmNpWWVmVmFmTThFQm9Cc20xUnAzZWwrWnN0aDR3VEE2ZXdac0ZUN1RBZnVYa1ZnS1dOdmtFblVqQWMwcSt6ZkZuSnl0dnIrClBuUVhPOTB5L0FRbS9McjJ3YUpkRCtYV3AwSzlBL0tjTVAvSkFiTVJoaWRLRS90RFBqdnpDWGVnMkRHZ1NHUUQvb3k0VU5VdlVEaVYKSGZqejBZTTBqTmtPZHJHUEEvZ2k3Mk4rU1BySklsR1BBckJsekYzd1dNK2tvMXlwNEI3NzhxODRYZTFqbUQ4VmNhS0J3c0Y5NGE0OApuc2ovalAwNGVQRG81ajBZVy9LUEJpdnpLTy9sSGhHNWZqdk5QS2l3K0twOGZGNUxaY2tRNXRrSlZNWjJoWmRxcGpIN25adDcyV0RGClN3UGZsSDNrNWNFcDdlSVkvTTVQMjBlaFp3eFdHZjNoNVhDTmdIOFNGT3pKd01yQ2JyaXBWeVk3SEZyb0RTOHZCbXNoN0NrSFRMZHEKK0tpWHB1RThoTlBBWUhMWUFaK1dYOUNmTk5ocC93T24xNnBIdXYzMXQxVUFQRzE1MEZQQ0dZN1BHS1F0SDRNRmMxcWlHTEYrc3hZOQpNU2ZnRHF4ajRmdjdJd2Q5TEVjeHcwWDhpQTc1QUloK2l0a2w0QW56eHJWRHhIZ1FjYi81bUhTM0U0ZHdxaDE4emthK1pnNG9kVG5DCjJYOHpJbGFCRk90OUVPekNqd0tXWkhKRURwMGZWY0o1bnEyWXFiOTd1QVVqQ3VWSHlOUHZQb3BFaFg0Rmh4dTVoU2hNWDBMMHAzV2IKb0QrZFB3YTBiVWtVbmVNaC9ZbFloQ0NJRUFWaTJNOUFpSDBmck5mWUVzTjFEYU4rUFR3M2FkZ2paNWZsdGo3Qkc4MG9NZnRGRHhERgora0ZXS2llOHVZemVqWG00MHlSZ21rSXp0L1l0WE5uWDZYZXRVSzBZM3poRndoN201Tm5nZ0kwWGMrQk9Fbk1CNjdreVo4Yno1VWZUCkNOaUlkaENOTm1CTGZJVG9UNFh4RC90ZWdINnY4NWNWaitZbDMvb2lDMnZUTk50c2Zkb04xdUxFbTNtSG0zVVM1YlBSc24vYWhTbFoKRkpvT3drTmdtMEJ2c21ydFVtOHl1eGpVbkNLOUdmOTYyVHFLNzduNlU4NjVQc0JMQ3NMbFhCSHp0UzcxcHJqdHNCMU5IS2kxS0xxaQoxc21lOFFIMVQwK2p1M0pUcTVyckRvNllmMlh5K1g5TXI3YUFKZlozd2pDSDcwanJNYUF0VVNJNGlyZUNQNE5PVk9hTUZ6OHo4TSs0Ckd3YzdSd29xUXVnak13di9DWDdUZ1NxbDdFTjJIVXk5OGFGSUJGUkNNTkpROXN2RWxNcVl4T3JEQjFVSHpIM2R3em9MYkROaUZyVHEKb25TSUoyK2RzTjk1Nk8vYU9PVHBLdUNOU0tlY0g2MnlNNEZXcldGWWFGS0ZDMUhGK2Rvd3R3OGpPM254QW5VZlFORGJvcTBGVHYwegpDNy9ER2ZPc0ZxRXBVU0s5NkJYZ3lUWDM0TSthbjRFTmRTa2NEZENsbkxLbU5CK1lDMUNwWHMyc1JGbDRGeWNNZEhSRjNLQVdOYlIrCjlQL1NjWDdFYU5qY0ZQSnpaaVg2RHQ1YTBNQm0xazBCdkg1dzg4MGNCQ0taZnVNQnFIeDZmRUlBeTFSNzZLTHkrcG9uYUdDMkJSZEoKMUk3d096UDRMbnFtckV4Ym4zamltZHFVMlpWOEtiSUFHcGNBemhRQU1CY0tSTmxXNWx1OWdPZmQ4RVlFdEFiQUVIOG1ZSGtyMkpnOApaVGY4NUdPLzg3UGZnWFh4dk8yaGZYQ2dtQjJ3ZlorM2k5azQyd3YyekI0eEp0WWp3VmhYd0NpYldKcWZ3R0FJbHNROW8ra05BMDZJCnVtNGladVI2UjhOZTVFYnFKb29lc2pQcHZ0M3I5alBmQndGYko3MHVPV2ZWemR4dFVmN3ltWDdiWUFadUVpRDFlWkZZWDE1NlFWZjQKTWhRTFJGNVd0TlZMbkhITzRFWE53cUhiWUdKR3c3c0R4TVVqd2NjaE1PRmRRY0tTd0pudnp3YW93ZzRSd2VjVkVBRVYxMUZFR1BDSgpRQ3dhaUFqd1FaOVBBbEhyY2lEeEhBbTRmdUpDSW95VHp4d1JBaDlyUE1wclp2VjFuUGo0U0duRC8wdVdCT0srMVQ2Tys3dkdyYjlJCkVlR1E2MzFvNHdOME5UOWk3TE9SSTRIQmFnd2VQMndzRWJvS2ZBQXZMR1dvK0NuRlNySUF1RHlsM2s2Wkc5VjRFVWFKNWNZQTVVWEwKTklhSEs2ZkJSRWhRT09LMmFTd2xWNE5iQzBvcWxhYngrcm03amFkZmgzdFdXNHBBYUtNRUFERS9LazhEQUhCWkVDY3pJTkw1L1ZZQQpZbXRVSDRPaWRqcVlFQUJFc2Q0ZkJ3SXIxM3RUL3B1OVQ1Wi9lN3lGeDhpdnNqRG04dnAzTTQraDY4QnY0N0g1NlJZUUFNRGFlRE9QCmRUWTM4bGh2Szhkam1rRk1EdW9NMGhmdzJNVTBsamVTOG5WMTVuanNPaEM5b1FaeDdUTFJIbWtRRTNuZHAyME1jeDRwS1lycFhZM2UKVWwzaStXTUFjN2tZeGVyRzFlaHR6aUpTTWhUVFBvMkRpbXhJalVGUW01RHFuVTIzTVhiZmJGYmZrWW5qSndmQ2FPOHMzL2dnSnBOcgo5d0IyUjU3TTkycVVVQm5EVWtZK3dSaDQybEtKRXBQVjhWWnRPZG1jTk94RUN2dlFaSDlXSG9PNnRweWNqZncvcDJhVDRFK2JtWWwwCmxpa2ZFaDdMeFhoaGI4ZUhLd2hXM3pPY2RZMmUvYTVtOU5TN0w1UVJDSDdEUmNxNjBPTUw4MXd6bEU4eFAyV2l5QzVsWXpnRG5qYzUKdHZ4OVVoRVErMk12Uk5XOVFxOTc2SUcraXBlSlZuNGU0WjlzQUs1c1p6ODVLTWR1Zmx4QmE3eE0rYnZ3NE4rRHZHNzZ6N3pQUjduYgpURTR2OUxCWmR6eVE3dXh5ak5zYmRMREJSQ2MvZUJrN3NjRzlxcHYvb09abXc0WlZyeUNpNkJsRTJCQk1sY1AzRmJBa0Zsa0czd3ZPCkVZWU9VWlFlWGR4My9PaG9LZS9oUFJCRVIwc1ZId3dPdVFEdFB0MlVyLzExL0FXOFUycmk2TTlBdW0wRWY3NW1PTmhET216eFNpSnEKdTRDL01NOGh0d0NlMDBBdm9SWUZWdnZMQWNyTDY0c2Z4alk4QU1IZUF2NXNJN0F1S2lUaWYvMElzSkZKdHp0bFRwcmhVemRBNEFORwpTNi9HaFc1SERKWVJvSEc0N3kzNHgwbGJmTEd4dHcxV01sa00vdkxDNjFUd3ZkUnQ4SS9mbVRONDlyUW9Cc2E0eVV0QmxJSkg1U21wClFHUnV1a1FRblUvUlJpeGFJalAyZWF0UW1UMGFhYSs2MThVWlZtbnhBMzdPOVJEc2xYU0VxRGNPc2xNZkF5eW5HTDFna3hjVUV2SFEKNGZWSjIwOEhlU2RkREovVUtrN3c2UU9uNDFHVEFaR0tWUWl3VnBOeGdQazBDMUlSZUErOXRLc21ndWhGUitUZ3p5NFRsRnQ5WU15bgpBY2R0RThLZXJxWG8wYXhtQWQ2RGdURXdwT09TOWIyVm5jdnFMNHk4dGtBdUdvZ201Z1BuZDM0WkpsOXk2Nmc1S2hWcG9TYkUvVU5sCmJIT2htbFBYeHlLZG9vdzd5Q3luQVlhWDhJd0RmQnJqektjWkZ3S2Uwa0drMDIvd1lqU2hVNGQwT1ZPSlNNZHJxcE9qdWpWR0JVTnQKdzJNRWV5cTVRMGoydjhLMExIWXhNM0pTbGVPRCtxT0RMTVYweEFmMVJ3ZWw3dXRUaXcvcWp3NUNpdW1ORCtxUERsS2NyQzgreUk4TwpadjhyWllqaUVmd0IvZU52bnRmenc4dmhaL0d6ZWZBWUVnWi90b0xqN2Mxc1N4N204OWI4ZjUwSzIrbjViNzQ1UGNRZi9ObTNmS1VTCkRSWG0wKzFzL29DU21VS2pDS3MydkRTMzB2ek5QOUlXaEJoUnNEeFgrSTZWVm1WejgzRmMrTVo2S1o1WVVGYktyclUzZXBhL1piQ2gKdXFjK3RLdCtHRDBFK1daMGxJOGUrR2VQMnVVcElra2VyQ0t0NURJWDVvZmN1ZWl1MTk1RnB3UW9HQk1idFVwZ2V5aSs1K2JOalArNApTUHJMMlg2MTBDYzdieG4vQ2RzeUFVRjRuaW5JSHVDZGVrc2NrZ05ENW1Rek9wUFBRYVBYYisvQXcvSUNtSXVsRVBVYlBjNU1Cbjc3ClpIUTNUTTl3ZnMvd1Fkcm96UVptMEdvb0cxMTdNekRMeHZzb1gxWFlDRGN0Y3R4V1J3Nkh6SEsvYnBHYU5WRG54N2huc1VpaFl3TmEKWDBMeFF5Y1pqUGo1MFo4d3BkRkJmL3FkSStQQVNWc0Q5ajFzSVZOMjAzL0dIVjdLa0tHQ3p2Q0dHQnJFZHp0K1lpUzVnbkduajN3OQpydU1va3p2SU5GaGxqeks1QnplYkNkUXg4SUNQK3g4d0UxQmFIbTBvL0hObWdzR3F2SzNmeDB5Z1F0dWFJVjVwSmdCRGh6VVUvamt6CkFSbzZqS0h3ejVrSllDNnNvZkRQbVFrOGVabitjMmFDd2NvWkNtSXpRVGtqaE01Q3JNWGxOZ2RhL2J1K3lETjBwWmEvd0pYcURJcEEKS2I1M2pjN252b1BXbStmNEsxU3BaYUJMMHkyajgyZWRNbm8zalUrb1MyTndYN0NJM1N0cXdSNTdsS29EUXBOMUlJSGpEalhmZHZSTAo0NzJYU2Z3SU9yakVEelpYdzA1NWYwQmJ1bWx0Q1U5WWVOcVMzc3J0aEQxai9FTExEclZsM3VkQnQwOFRYK2RreGYvVFBma293K1BICkUzZWp0QzJneDRwUFVrWG53Tzk2cm9wV0h6NW9BeXlSQTZkYUtUMzJSWXVBU0sraWJCU2dVdUhJSFBBNFk1VmJtemFrMFBuQ09CdUcKNyt5VjRrN0lHM1ZrakNBRE5FcWQ1dU9sdGlQS1dqRzBTVlJhQkNIRm5uMjBSV0xKK0F0UHlTMEc0THhnbFBMa2FleFNtMEFMQWY1eAo4NnA2MkRSVzdpUVNLSE51OTBXTWVGR2d3WjcvaTFxcVVtbHB4VUZJZERqSXBlVlI1NHRlL3ZuaU5Gb1ZuUzhhalNjSEd6ODd2bDZjCkx3WmRKVit3bkdXTzJ4NjNUT3Ntd1VHb3Q4NGRCUkdPV0M4Z09BZ05tNDNXbktYQWdKamFMazVTYzM0ZUFKenNsbkIwNEVzbk5OQmkKRHpnZG1leituMVM3aUl3RHlHZ3B4T2ZNZDUwOTgxM3Y0UDk1MmJpNVJBdkVjZ0p6bnc2dENNT09Xa04rU0lYQkNkSG5udlQxK3E3TQp1MnZNSEVFaU81bytmVE5ZeFllUTZGYjA2NDhnblZLbmJ6QWtwUG44RGI4NVZMZUs3aGdpWkFJOElxQlRZWm9JUVQ5SEJEaWFGZThJCkV0MmtKMGNDSm9TYWpxODJEQkZjb2lOSTc0MUgwWThuN25oZWU5aVZ4d2ZwK090SncxRTBuV0lvZFJoTkZ4WlRWRVRueDFLc3BIQ2EKVFpkRUFnQmc5VFZ5NHdVSTFOUk4yeGlvMUp4TEVLZ2gxUzNUUUFuOGpFanhqclIxVEtNZDkrdEtETGlVU2svczVMcUZwNkZMN1JZQgpvQ21tbFJMUUEvZXFUZVB5YUo5ZkpJTjdkbmxNY2hvYVNRbFRLSEVFNEdncWxYTnV0cFdId1FvVEh2YThONEhiNzZUZkpIOXh0MFRUCkQ1clB4MFA3alR3R0RCVEhiVHhXQy9vNEFMSThwZ2hpa01GdTVUSDcwbkViajJFYnB3eVBhUVpSYzN0VUdZUVBBQT09DQoJXV0+DQoJPCFbQ0RBVEFbDQoJVFVMSVk0T0k3NWJWQVA3OG8xOEtBT0F4clNCS05aTzZ1RW9Eb05OWW9jR25XZmRKajJIZ2t5WWxIQU82bEZ4MU5ZQ0JxU3J4U21PQQpTY3k3K0cyckFhMWFaVktpL1VWcEdtVXZxVTgyTHNZUXJ1SFFHcjlCTnNycEpxRXloa1BLai9OMjVITHc1R3NuZVNBbUErdHRlOEJrCjRYWXpPN0xpS0JUR3NNUGxtVW8wQmxyMnhhT1lXaUxlbXpoaTZuMzAzWlprQmhQY0pVVmNkZ3lzdGtRSm55SGNnWXhFcnY4WVFoLzEKR3FmQlF0bzk3QmJPNDFJdC8vVVVNOU1oZzFDR2lTUlJJZjZuUDJHZU9sVTZZYkJLRlUvY3UzUUNZcmtzbnRCZE9zR0dRNldQSmRHNgphRHFZRkI5TDhoN3M4Z3YyZ1NpbUR3T296ekNxd1B1MjdXQ1BEWjQ5L0FlTElGdVRBTDFsNENWQnZVS2x6RVAxQURrWm5RTnNrYVRDClB4c3V3ZEVwa0IxSTJ3YnRlZ01tanRQZWhxZU96c2R6a0M4aEt6WDhkQkZGdWdMSjFxREJUaHR0QkRiQWl6S1dod2Y2Z05ucERWTFcKZU12TFA3aExaeEs2ay9BdkRtRllMNTV3bHNrazVTWGREV0tqOXNpZE5ZUk9yNVo1NmFzZlhSaXMyYmV6NWFmWW43M0NrNk1XenZFdgo4WFVlWk9pWVJHOFFZRU9SUVg3QlJEckNzc3E3bDY2YWFPU2hYbm4zTTJ6L2pxR0VoaS9vY3I3alRIVHBIWjBTd05PRTl3RDdLVWlCCktDYit3dURQUGcxeE9FVUwzMmVQOGZzWSt3bm5yejY4VTV5dFNlZ0grTFVVaFpXRmlUTCtocGk1OU1PeVZTcHV1Um9WQTMzQkNWZXYKd3E5UytmSnhTQU0yNXdzazZoZjRwL2NPb3c5Zk9QdUo0TDlYWHdUaGQwRnVORUQybWZFMHlGR25seSs0bzA2U0xOWTdVU2E0K1JmQwo1cE40R0hLb2o0MVQ5S2txeVA4ZjYvc2ZHK3ZiL2xmS2tBQ1RxZUQ0c0xpWjhjOGNEVllyK09adGZqcnY0QXVoWVc2KytOblV4ditaCkh3ejRBL1VmQnY2RC8wWmlEemdSZlNCQ0lmQkhDSDVibXhnYzZOMEgzUGxRQTd2TDBKODluQW8vMDlQUGRqTSsvT2NoRHIvcTFtdnQKU3VFaC9rQzlPd1R2Smg0Y1lEVFlFTHdOSGpuaFFlY1FqSEJvd0I2eTRIL2RmeHZPNEQvczRjV0FQV0QwQU9CLzNiRUJvMGNFM3ZvUAorT01KZlBnRlgvMzdBY2NlNmc4Zlg5akRESXk4MnpRRVlnOWVISC80b3o1Z0QydjBJZW9MRVRFd2t3RDRnTWRDNEl1SFFBVCtPelVFCjRQK3REYmd2R01FSUhQNkJVKzlqR0FFL0FoaFRBNDZBcnRIL0U3NVFNQWJlb2wveDRvR0hBUG9Yd0lxZ0R3QW5BRUE5aVZHL0lCN28KZ1UwTjM0WTJuSjh2QWdrS1VhQVpnYUdqMmMwTTRRZUg4Nkg3emxBQ3ZBZkhoZm5Da1ZnNEdrQWZNSUlnd0ljWWhvZURERmxFTk9LSQpnZEhFaU5HMGlJaHBFVUcwaUZDMGlQQnBFWUVFaUhDMGlOR2t3R2hTNEdKU0VJZ1VCRU1LZ2lNRlF3Q1dGQmhOaWhnOTNiWTBIOUg4CkFjakFYLzlMYWxtSDdHU3BqM0M2MUNlRkNZTVhxQ2xiaDRxVEJvL3BhVk9mRkNZT1FESlRCeDhWSm04ZHlvbE85bkFZVXgrQnZEeGsKejZmdFEzTjhQTTBQUC85Nzduend2NTBPUDVzRkpUMUFvbWJieVh5WXJjU0dMNVBqL1BDditXeFluZjluU0wxMDVBa1pEdDdkYkRjUApnWENBNWk4dHNzYnlFZUE0aW84SW5HWWtQQVlKRytYb2lzY1FZZkVZeFVwNGpNOUw0QytjL2czOFFPQVVMeEVFeFV0RVFFUlNJZ2hKCkN2NmxlQWw4WUhnSlBvbFJ2NEJvNmNIOXR3c1d3V2daZ3RFeWVGUk1FRXJONExTZXdRV0tCa2VhQnYwR0VZVFdNd1N0WndpeG5pR1EKbmlFWVBVTndlb1lJMEVUZ0VRVC9KOFFMVFpuK2lMSHlwVGh0SkdGbzRqd1JrNW82RWl3MGVlcVR3dlFwRVVNRVlFUk1qZ1QvdzRRcwpFS0I1S2tEUVBCWEFJSEVESEhFREdDSnVBS040S29EeGVTb0F3YUxmd0hkeEJBZHhWU0JBY1ZVZ0tDSnJJQVRKQ3Y2bHVBcDhZTGdxClFKRVIvb0loYVNEdzN5OW1BVWJ2QkJpOVE4UkVKQ0VvdlVQUWVvY1E2QjBDNlIzNEc0WWt0T1lKMEpvbklOWThBYVI1QW96bUNYQ2EKSnhDa3ljQWpDZkZQQ0JxYU5QMFJad1ZOY2VKSTBJaVlVTkNrSjQ4RUxFQXdvcVpFQUVyVUVBa1lVWk1qd3Y5dFVhdmxLRnNXV0xiSQo0dlFDLzlyNk9sN01XNGZ4enhwWXRvdmorRi96aC9GbXN6Mk5UL01kZVBLd09NeVBwKzFoL25CY2J2OE52d0UvWVY0SE52SUxhZmcvCndrbmVyZz09DQoJXV0+DQo8L2k6cGdmPg0KPC9zdmc+DQo=);\n  -webkit-background-size: cover;\n  -moz-background-size: cover;\n  background-size: cover;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  overflow: hidden;\n  vertical-align: middle;\n  width: 1.3rem;\n  height: 1.3rem;\n}\n#download-btn {\n  display: none;\n}\n/* Content */\n#content {\n  width: 100%;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 20px;\n}\n/* Code */\n#content section.code {\n  display: none;\n  background: #FFF;\n  border: 1px solid #E0E0E0;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 15px;\n  font-size: 12px;\n  -moz-border-radius: 1px;\n  -webkit-border-radius: 1px;\n  border-radius: 1px;\n  font-weight: 400;\n}\narticle.component {\n  padding: 0 0 10px;\n}\n#content section.code h3 {\n  margin: 0;\n  font-size: 12px;\n  color: #000;\n  font-weight: 400;\n}\n#content header h2 {\n  font-weight: 300;\n  margin: 10px 0 25px;\n  font-size: 20px;\n  position: relative;\n  display: inline-block;\n  padding-right: 10px;\n}\nbody.light #content header h2 {\n  background: #F4F4F4;\n}\nbody.dark #content header h2 {\n  background: #4A4D4E;\n}\n#content header{\n  position: relative;\n}\n#content header:before {\n  content: '';\n  width: 100%;\n  display: block;\n  position: absolute;\n  left: 0;\n  top: 23px;\n}\nbody.light #content header:before {\n  border-bottom: 1px solid #E0E0E0;\n}\nbody.dark #content header:before {\n  border-bottom: 1px solid #58595A;\n}\n#content pre {\n  padding: 0;\n  margin: 2px 0 10px;\n}\n.showcode {\n  margin: 10px 0;\n}\n.showcode a, section.examples a {\n  color: #288edf;\n  text-decoration: none;\n}\n.showcode a:hover, section.examples a:hover {\n  text-decoration: underline;\n}\nsection.examples ul {\n  margin: 0 0 20px;\n  padding: 0 0 0 20px;\n}\nsection.examples h4 {\n  margin-bottom: 5px;\n}\nsection.examples li {\n  color: #58595A;\n}\n/* Side Nav */\n#sideNav {\n  background: #4A4D4E;\n  position: absolute;\n  width: 100%;\n  z-index: 1;\n  height: 100%;\n  left: 0;\n}\n#sideNav ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n#sideNav li a {\n  color: #F0F1F1;\n  display: block;\n  height: 46px;\n  font-size: 16px;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 12px 0 0 20px;\n  text-decoration: none;\n}\n#sideNav nav.site, #sideNav .combo {\n  border-bottom: 1px solid #58595A;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 10px;\n  display: block;\n}\n#pageNav li {\n  border-bottom: 1px solid #58595A;\n}\n\nselect.docNav {\n  -moz-border-radius: 3px;\n  -webkit-border-radius: 3px;\n  border-radius: 3px;\n  background: #595B5B;\n  background-image: none;\n  box-shadow: 0 0 0 1px #303233;\n  border: none;\n  border-top: 2px solid #666767;\n  color: #FFF;\n  text-shadow: 0 -1px 0 #000;\n  overflow: hidden;\n  font-size: 14px;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 20px;\n  -webkit-appearance: none;\n  -moz-appearance: button;\n}\n@media screen and (min-width: 650px) {\n  #site.open {\n    transform: translate3d(0, 0, 0);\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  #main-header nav {\n    display: inline-block;\n    position: absolute;\n    right: 0;\n    top: 40px;\n  }\n  #main-header ul {\n    list-style: none;\n  }\n  #main-header nav li {\n    display: inline-block;\n    margin: 0 18px;\n  }\n  #main-header nav li#download-btn {\n    display: none;\n  }\n  #main-header nav li a {\n    text-decoration: none;\n    font-size: 20px;\n    color: #7F7F7F;\n  }\n  #main-header nav li.selected a {\n    color: #373435;\n  } \n  #slide-menu-button{\n    display: none;\n  }\n  #main-header hgroup {\n    text-align: left;\n    position: absolute;\n    display: inline-block;\n    top: 24px;\n  }\n  #main-header hgroup h1 {\n    font-size: 60px;\n  }\n  #main-header hgroup p {\n    font-size: 15px;\n  }\n  #main-header {\n    color: #373435;\n    background: #fff;\n    height: 148px;\n  }\n  #content {\n    padding-left: 240px;\n  }\n  /* Side Nav */\n  #sideNav {\n    background: transparent;\n    width: 220px;\n    z-index: 20;\n    left: 10px;\n    top: 150px;\n    height: auto;\n  }\n  #sideNav nav.site {\n    display: none;\n  }\n  #sideNav .combo {\n    border-bottom: none;\n    padding: 36px 0;\n  }\n  #sideNav li a {\n    padding: 12px 0 0 10px;\n  }\n  body.light #sideNav li a {\n    color: #797B7B;\n  }\n  body.light #pageNav li {\n    border-bottom: 1px solid #E0E0E0;\n  }\n  select.docNav {\n    background: #595B5B;\n    box-shadow: 0 0 0 1px #303233;\n    border: none;\n    border-top: 2px solid #666767;\n    color: #FFF;\n    text-shadow: 0 -1px 0 #000;\n    padding: 3px 20px 4px 8px;\n    -webkit-appearance: none;\n  }\n  body.light select.docNav {\n    box-shadow: 0 0 0 1px #949696;\n    background: #DDE1E1;\n    border-top: 1px solid #FFF;\n    color: #454545;\n    text-shadow: 0 -1px 0 #FFF;\n    width: 192px;\n  }\n}\n@media screen and (min-width: 880px) {\n  #content {\n    padding-left: 300px;\n  }\n  #sideNav li a {\n    display: block;\n    height: 60px;\n    padding: 22px 0 0 10px;\n    text-decoration: none;\n  }\n  #content header h2 {\n    font-size: 28px;\n  }\n  #content header:before {\n    top: 30px;\n  }\n  section.code div {\n    display: inline-block;\n    width: 48%;\n    vertical-align: top;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  section.code div:first-child {\n    padding-right: 5px;\n  }\n  section.code div:last-child {\n    padding-left: 5px;\n  }\n  .max-width {\n    max-width: 1180px;\n    position: relative;\n    margin: 0 auto;\n  }\n  header#main-header .max-width {\n    top: -10px;\n  }\n  #main-header nav li a {\n    font-size: 22px;\n  }\n  #main-header nav {\n    display: inline-block;\n  }\n\n  #main-header nav li {\n    margin: 0 25px;\n  }\n  #main-header nav li:last-child {\n    margin-right: 0;\n  }\n}\n@media screen and (min-width: 940px) {\n  #main-header nav li#download-btn {\n    display: inline-block;\n  }\n  #main-header nav li a#download-btn{\n    position:relative;\n    top: -15px;\n    display:inline-block;\n    box-sizing:border-box;\n    -moz-box-sizing:border-box;\n    background-clip:padding-box;\n    font:inherit;\n    background:transparent;\n    -webkit-user-select:none;\n    -moz-user-select:none;\n    user-select:none;\n    text-overflow:ellipsis;\n    white-space:nowrap;\n    overflow:hidden;\n    font-size:16px;\n    line-height:3rem;\n    letter-spacing:1px;\n    color:#454545;\n    text-shadow:0 1px #fff;\n    vertical-align:top;\n    background-color:#e5e9e8;\n    box-shadow:inset 0 1px #fff;\n    border:1px solid #a5a8a8;\n    border-radius:6px;\n    margin:0;\n    padding:0 1.25rem;\n  }\n  #main-header nav li a#download-btn, #main-header nav li a#download-btn:hover {\n    border:1px solid #143250;\n    background-color:#288edf;\n    box-shadow:inset 0 1px rgba(255,255,255,0.36);\n    color:#fff;\n    font-weight:500;\n    text-shadow:0 -1px rgba(0,0,0,0.36);\n  }\n  #main-header nav li a#download-btn:hover {\n    background-color:#2f9cf3;\n  }\n  #main-header nav li a#download-btn:active, #main-header nav li a#download-btn.is-active {\n    background-color:#0380e8;\n    box-shadow:inset 0 1px rgba(0,0,0,0.12);\n  }\n  #main-header nav li a#download-btn:disabled, #main-header nav li a#download-btn.is-disabled {\n    opacity:.3;\n    cursor:default;\n    pointer-events:none;\n  }\n}\n\n\n\n"
  },
  {
    "path": "doc/css/prism.css",
    "content": "/**\n * prism.js Twilight theme\n * Based (more or less) on the Twilight theme originally of Textmate fame.\n * @author Remy Bach\n */\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: white;\n\tdirection: ltr;\n\tfont-family: source-code-pro, Consolas, Monaco, 'Andale Mono', monospace;\n\ttext-align: left;\n\ttext-shadow: 0 -.1em .2em black;\n\twhite-space: pre;\n\tword-spacing: normal;\n\t\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\t\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"],\n:not(pre) > code[class*=\"language-\"] {\n\tbackground:#181818;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tmargin: .5em 0;\n\toverflow: auto;\n}\npre[class*=\"language-\"]::selection { /* Safari */\n\tbackground:hsl(200, 4%, 16%); /* #282A2B */\n}\npre[class*=\"language-\"]::selection { /* Firefox */\n\tbackground:hsl(200, 4%, 16%); /* #282A2B */\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tborder-radius: .3em;\n\tborder: .13em solid hsl(0,0%,33%); /* #545454 */\n\tbox-shadow: 1px 1px .3em -.1em black inset;\n\tpadding: .15em .2em .05em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: hsl(0, 0%, 47%); /* #777777 */\n}\n\n.token.punctuation {\n\topacity: .7;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.tag,\n.token.boolean,\n.token.number {\n\tcolor: hsl(14, 58%, 55%); /* #CF6A4C */\n}\n\n.token.keyword,\n.token.property,\n.token.selector {\n\tcolor:hsl(53, 89%, 79%); /* #F9EE98 */\n}\n.token.attr-name,\n.token.attr-value,\n.token.string,\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor:hsl(76, 21%, 52%); /* #8F9D6A */\n}\n\n.token.atrule {\n\tcolor:hsl(218, 22%, 55%); /* #7587A6 */\n}\n\n.token.regex,\n.token.important {\n\tcolor: hsl(42, 75%, 65%); /* #E9C062 */\n}\n\n.token.important {\n\tfont-weight: bold;\n}\n\n.token.entity {\n\tcursor: help;\n}\npre[data-line] {\n\tpadding: 1em 0 1em 3em;\n\tposition: relative;\n}\n\n/* Markup */\n.language-markup .token.tag,\n.language-markup .token.attr-name,\n.language-markup .token.punctuation  {\n\tcolor: hsl(33, 33%, 52%); /* #AC885B */\n}\n\n/* Text Selection colour */\n::selection {\n\tbackground: hsla(0,0%,93%,0.15); /* #EDEDED */\n}\n::-moz-selection {\n\tbackground: hsla(0,0%,93%,0.15); /* #EDEDED */\n}\n\n/* Make the tokens sit above the line highlight so the colours don't look faded. */\n.token {\n\tposition:relative;\n\tz-index:1;\n}\n.line-highlight {\n\tbackground: -moz-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */\n\tbackground: -o-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */\n\tbackground: -webkit-linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */\n\tbackground: hsla(0, 0%, 33%, 0.25); /* #545454 */\n\tbackground: linear-gradient(left, hsla(0, 0%, 33%,.1) 70%, hsla(0, 0%, 33%,0)); /* #545454 */\n\tborder-bottom:1px dashed hsl(0, 0%, 33%); /* #545454 */\n\tborder-top:1px dashed hsl(0, 0%, 33%); /* #545454 */\n\tleft: 0;\n\tline-height: inherit;\n\tmargin-top: 0.75em; /* Same as .prism’s padding-top */\n\tpadding: inherit 0;\n\tpointer-events: none;\n\tposition: absolute;\n\tright: 0;\n\twhite-space: pre;\n\tz-index:0;\n}\n.line-highlight:before,\n.line-highlight[data-end]:after {\n\tbackground-color: hsl(215, 15%, 59%); /* #8794A6 */\n\tborder-radius: 999px;\n\tbox-shadow: 0 1px white;\n\tcolor: hsl(24, 20%, 95%); /* #F5F2F0 */\n\tcontent: attr(data-start);\n\tfont: bold 65%/1.5 sans-serif;\n\tleft: .6em;\n\tmin-width: 1em;\n\tpadding: 0 .5em;\n\tposition: absolute;\n\ttext-align: center;\n\ttext-shadow: none;\n\ttop: .4em;\n\tvertical-align: .3em;\n}\n.line-highlight[data-end]:after {\n\tbottom: .4em;\n\tcontent: attr(data-end);\n\ttop: auto;\n}"
  },
  {
    "path": "doc/css/topcoat-desktop-light.css",
    "content": "/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.button-bar {\n  display: table;\n  table-layout: fixed;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n}\n\n.button-bar__item {\n  display: table-cell;\n  width: auto;\n  border-radius: 0;\n}\n\n.button-bar__item > input {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.button-bar__button {\n  border-radius: inherit;\n}\n\n.button-bar__item:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.button,\n.topcoat-button,\n.topcoat-button--quiet,\n.topcoat-button--large,\n.topcoat-button--large--quiet,\n.topcoat-button--cta,\n.topcoat-button--large--cta,\n.topcoat-button-bar__button,\n.topcoat-button-bar__button--large {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n.button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.button--disabled,\n.topcoat-button:disabled,\n.topcoat-button--quiet:disabled,\n.topcoat-button--large:disabled,\n.topcoat-button--large--quiet:disabled,\n.topcoat-button--cta:disabled,\n.topcoat-button--large--cta:disabled,\n.topcoat-button-bar__button:disabled,\n.topcoat-button-bar__button--large:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n.topcoat-button,\n.topcoat-button--quiet,\n.topcoat-button--large,\n.topcoat-button--large--quiet,\n.topcoat-button--cta,\n.topcoat-button--large--cta,\n.topcoat-button-bar__button,\n.topcoat-button-bar__button--large {\n  padding: 0 1.25rem;\n  font-size: 16px;\n  line-height: 3rem;\n  letter-spacing: 1px;\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  vertical-align: top;\n  background-color: #e5e9e8;\n  box-shadow: inset 0 1px #fff;\n  border: 1px solid #a5a8a8;\n  border-radius: 6px;\n}\n\n.topcoat-button:hover,\n.topcoat-button--quiet:hover,\n.topcoat-button--large:hover,\n.topcoat-button--large--quiet:hover,\n.topcoat-button-bar__button:hover,\n.topcoat-button-bar__button--large:hover {\n  background-color: #edf1f1;\n}\n\n.topcoat-button:active,\n.topcoat-button--large:active,\n.topcoat-button-bar__button:active,\n.topcoat-button-bar__button--large:active,\n:checked + .topcoat-button-bar__button {\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n.topcoat-button:focus,\n.topcoat-button--quiet:focus,\n.topcoat-button--large:focus,\n.topcoat-button--large--quiet:focus,\n.topcoat-button--cta:focus,\n.topcoat-button--large--cta:focus,\n.topcoat-button-bar__button:focus,\n.topcoat-button-bar__button--large:focus {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n  outline: 0;\n}\n\n.topcoat-button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.topcoat-button--quiet:hover,\n.topcoat-button--large--quiet:hover {\n  text-shadow: 0 1px #fff;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-button--quiet:active,\n.topcoat-button--large--quiet:active {\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  background-color: #d3d7d7;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n.topcoat-button--large,\n.topcoat-button--large--quiet,\n.topcoat-button-bar__button--large {\n  font-size: 1.3rem;\n  font-weight: 400;\n  line-height: 4.375rem;\n  padding: 0 1.25rem;\n}\n\n.topcoat-button--large--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.topcoat-button--cta,\n.topcoat-button--large--cta {\n  border: 1px solid #143250;\n  background-color: #288edf;\n  box-shadow: inset 0 1px rgba(255,255,255,0.36);\n  color: #fff;\n  font-weight: 500;\n  text-shadow: 0 -1px rgba(0,0,0,0.36);\n}\n\n.topcoat-button--cta:hover,\n.topcoat-button--large--cta:hover {\n  background-color: #509bef;\n}\n\n.topcoat-button--cta:active,\n.topcoat-button--large--cta:active {\n  background-color: #0380e8;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n.topcoat-button--large--cta {\n  font-size: 1.3rem;\n  font-weight: 400;\n  line-height: 4.375rem;\n  padding: 0 1.25rem;\n}\n\n.button-bar,\n.topcoat-button-bar {\n  display: table;\n  table-layout: fixed;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n}\n\n.button-bar__item,\n.topcoat-button-bar__item {\n  display: table-cell;\n  width: auto;\n  border-radius: 0;\n}\n\n.button-bar__item > input,\n.topcoat-button-bar__item > input {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.button-bar__button {\n  border-radius: inherit;\n}\n\n.button-bar__item:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Button Bar\n  description: Component of grouped buttons\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <div class=\"topcoat-button-bar\">\n      <div class=\"topcoat-button-bar__item\">\n        <button class=\"topcoat-button-bar__button\">One</button>\n      </div>\n      <div class=\"topcoat-button-bar__item\">\n        <button class=\"topcoat-button-bar__button\">Two</button>\n      </div>\n      <div class=\"topcoat-button-bar__item\">\n        <button class=\"topcoat-button-bar__button\">Three</button>\n      </div>\n    </div>\n  examples:\n    mobile button bar: http://codepen.io/Topcoat/pen/kdKyg\n  tags:\n    - desktop\n    - light\n    - dark\n    - mobile\n    - button\n    - group\n    - bar\n*/\n\n.topcoat-button-bar > .topcoat-button-bar__item:first-child {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n\n.topcoat-button-bar > .topcoat-button-bar__item:last-child {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.topcoat-button-bar__item:first-child > .topcoat-button-bar__button,\n.topcoat-button-bar__item:first-child > .topcoat-button-bar__button--large {\n  border-right: none;\n}\n\n.topcoat-button-bar__item:last-child > .topcoat-button-bar__button,\n.topcoat-button-bar__item:last-child > .topcoat-button-bar__button--large {\n  border-left: none;\n}\n\n.topcoat-button-bar__button {\n  border-radius: inherit;\n}\n\n.topcoat-button-bar__button:focus,\n.topcoat-button-bar__button--large:focus {\n  z-index: 1;\n}\n\n/* topdoc\n  name: Large Button Bar\n  description: A button bar, only larger\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <div class=\"topcoat-button-bar\">\n      <div class=\"topcoat-button-bar__item\">\n        <button class=\"topcoat-button-bar__button--large\">One</button>\n      </div>\n      <div class=\"topcoat-button-bar__item\">\n        <button class=\"topcoat-button-bar__button--large\">Two</button>\n      </div>\n      <div class=\"topcoat-button-bar__item\">\n        <button class=\"topcoat-button-bar__button--large\">Three</button>\n      </div>\n    </div>\n  tags:\n    - desktop\n    - light\n    - dark\n    - mobile\n    - button\n    - group\n    - bar\n    - large\n*/\n\n.topcoat-button-bar__button--large {\n  border-radius: inherit;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.button {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n.button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.button--disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.button,\n.topcoat-button,\n.topcoat-button--quiet,\n.topcoat-button--large,\n.topcoat-button--large--quiet,\n.topcoat-button--cta,\n.topcoat-button--large--cta {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n.button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.button--disabled,\n.topcoat-button:disabled,\n.topcoat-button--quiet:disabled,\n.topcoat-button--large:disabled,\n.topcoat-button--large--quiet:disabled,\n.topcoat-button--cta:disabled,\n.topcoat-button--large--cta:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Button\n  description: A simple button\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-button\">Button</button>\n    <button class=\"topcoat-button\" disabled>Button</button>\n  examples:\n    mobile button: http://codepen.io/Topcoat/pen/DpKtf\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n*/\n\n.topcoat-button,\n.topcoat-button--quiet,\n.topcoat-button--large,\n.topcoat-button--large--quiet,\n.topcoat-button--cta,\n.topcoat-button--large--cta {\n  padding: 0 1.25rem;\n  font-size: 16px;\n  line-height: 3rem;\n  letter-spacing: 1px;\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  vertical-align: top;\n  background-color: #e5e9e8;\n  box-shadow: inset 0 1px #fff;\n  border: 1px solid #a5a8a8;\n  border-radius: 6px;\n}\n\n.topcoat-button:hover,\n.topcoat-button--quiet:hover,\n.topcoat-button--large:hover,\n.topcoat-button--large--quiet:hover {\n  background-color: #edf1f1;\n}\n\n.topcoat-button:active,\n.topcoat-button--large:active {\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n.topcoat-button:focus,\n.topcoat-button--quiet:focus,\n.topcoat-button--large:focus,\n.topcoat-button--large--quiet:focus,\n.topcoat-button--cta:focus,\n.topcoat-button--large--cta:focus {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n  outline: 0;\n}\n\n/* topdoc\n  name: Quiet Button\n  description: A simple, yet quiet button\n  modifiers:\n    :active: Quiet button active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-button--quiet\">Button</button>\n    <button class=\"topcoat-button--quiet\" disabled>Button</button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - quiet\n*/\n\n.topcoat-button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.topcoat-button--quiet:hover,\n.topcoat-button--large--quiet:hover {\n  text-shadow: 0 1px #fff;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-button--quiet:active,\n.topcoat-button--large--quiet:active {\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  background-color: #d3d7d7;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n/* topdoc\n  name: Large Button\n  description: A big ol button\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-button--large\" >Button</button>\n    <button class=\"topcoat-button--large\" disabled>Button</button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - large\n*/\n\n.topcoat-button--large,\n.topcoat-button--large--quiet {\n  font-size: 1.3rem;\n  font-weight: 400;\n  line-height: 4.375rem;\n  padding: 0 1.25rem;\n}\n\n/* topdoc\n  name: Large Quiet Button\n  description: A large, yet quiet button\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-button--large--quiet\" >Button</button>\n    <button class=\"topcoat-button--large--quiet\" disabled>Button</button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - large\n    - quiet\n*/\n\n.topcoat-button--large--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n/* topdoc\n  name: Call To Action Button\n  description: A CALL TO ARMS, er, ACTION!\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-button--cta\" >Button</button>\n    <button class=\"topcoat-button--cta\" disabled>Button</button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - call to action\n*/\n\n.topcoat-button--cta,\n.topcoat-button--large--cta {\n  border: 1px solid #143250;\n  background-color: #288edf;\n  box-shadow: inset 0 1px rgba(255,255,255,0.36);\n  color: #fff;\n  font-weight: 500;\n  text-shadow: 0 -1px rgba(0,0,0,0.36);\n}\n\n.topcoat-button--cta:hover,\n.topcoat-button--large--cta:hover {\n  background-color: #509bef;\n}\n\n.topcoat-button--cta:active,\n.topcoat-button--large--cta:active {\n  background-color: #0380e8;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n/* topdoc\n  name: Large Call To Action Button\n  description: Like call to action, but bigger\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-button--large--cta\" >Button</button>\n    <button class=\"topcoat-button--large--cta\" disabled>Button</button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - large\n    - call to action\n*/\n\n.topcoat-button--large--cta {\n  font-size: 1.3rem;\n  font-weight: 400;\n  line-height: 4.375rem;\n  padding: 0 1.25rem;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\ninput[type=\"checkbox\"] {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.checkbox {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.checkbox__label {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.checkbox--disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n.checkbox:before,\n.checkbox:after {\n  content: '';\n  position: absolute;\n}\n\n.checkbox:before {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\ninput[type=\"checkbox\"] {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.checkbox,\n.topcoat-checkbox__checkmark {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.checkbox__label,\n.topcoat-checkbox {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.checkbox--disabled,\ninput[type=\"checkbox\"]:disabled + .topcoat-checkbox__checkmark {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n.checkbox:before,\n.checkbox:after,\n.topcoat-checkbox__checkmark:before,\n.topcoat-checkbox__checkmark:after {\n  content: '';\n  position: absolute;\n}\n\n.checkbox:before,\n.topcoat-checkbox__checkmark:before {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n/* topdoc\n  name: Checkbox\n  description: Default skin for Topcoat checkbox\n  modifiers:\n    :focus: Focus state\n    :disabled: Disabled state\n  markup:\n    <label class=\"topcoat-checkbox\">\n      <input type=\"checkbox\">\n      <div class=\"topcoat-checkbox__checkmark\"></div>\n      Default\n    </label>\n    <br>\n    <br>\n    <label class=\"topcoat-checkbox\">\n      <input type=\"checkbox\" disabled>\n      <div class=\"topcoat-checkbox__checkmark\"></div>\n      Disabled\n    </label>\n  examples:\n    mobile checkbox: http://codepen.io/Topcoat/pen/piHcs\n  tags:\n    - desktop\n    - light\n    - mobile\n    - checkbox\n*/\n\n.topcoat-checkbox__checkmark {\n  height: 2rem;\n}\n\ninput[type=\"checkbox\"] {\n  height: 2rem;\n  width: 2rem;\n  margin-top: 0;\n  margin-right: -2rem;\n  margin-bottom: -2rem;\n  margin-left: 0;\n}\n\ninput[type=\"checkbox\"]:checked + .topcoat-checkbox__checkmark:after {\n  opacity: 1;\n}\n\n.topcoat-checkbox {\n  line-height: 2rem;\n}\n\n.topcoat-checkbox__checkmark:before {\n  width: 2rem;\n  height: 2rem;\n  background: #e5e9e8;\n  border: 1px solid #a5a8a8;\n  border-radius: 3px;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-checkbox__checkmark {\n  width: 2rem;\n  height: 2rem;\n}\n\n.topcoat-checkbox__checkmark:after {\n  top: 1px;\n  left: 2px;\n  opacity: 0;\n  width: 28px;\n  height: 11px;\n  background: transparent;\n  border: 7px solid #666;\n  border-width: 7px;\n  border-top: none;\n  border-right: none;\n  border-radius: 2px;\n  -webkit-transform: rotate(-50deg);\n  -ms-transform: rotate(-50deg);\n  transform: rotate(-50deg);\n}\n\ninput[type=\"checkbox\"]:focus + .topcoat-checkbox__checkmark:before {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.button,\n.topcoat-icon-button,\n.topcoat-icon-button--quiet,\n.topcoat-icon-button--large,\n.topcoat-icon-button--large--quiet {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n.button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.button--disabled,\n.topcoat-icon-button:disabled,\n.topcoat-icon-button--quiet:disabled,\n.topcoat-icon-button--large:disabled,\n.topcoat-icon-button--large--quiet:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Icon Button\n  description: Like button, but it has an icon.\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-icon-button\">\n      <span class=\"topcoat-icon\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n    <button class=\"topcoat-icon-button\" disabled>\n      <span class=\"topcoat-icon\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - icon\n*/\n\n.topcoat-icon-button,\n.topcoat-icon-button--quiet,\n.topcoat-icon-button--large,\n.topcoat-icon-button--large--quiet {\n  padding: 0 0.75rem;\n  line-height: 3rem;\n  letter-spacing: 1px;\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  vertical-align: baseline;\n  background-color: #e5e9e8;\n  box-shadow: inset 0 1px #fff;\n  border: 1px solid #a5a8a8;\n  border-radius: 6px;\n}\n\n.topcoat-icon-button:hover,\n.topcoat-icon-button--quiet:hover,\n.topcoat-icon-button--large:hover,\n.topcoat-icon-button--large--quiet:hover {\n  background-color: #edf1f1;\n}\n\n.topcoat-icon-button:active {\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n.topcoat-icon-button:focus,\n.topcoat-icon-button--quiet:focus,\n.topcoat-icon-button--quiet:hover:focus,\n.topcoat-icon-button--large:focus,\n.topcoat-icon-button--large--quiet:focus,\n.topcoat-icon-button--large--quiet:hover:focus {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n  outline: 0;\n}\n\n/* topdoc\n  name: Quiet Icon Button\n  description: Like quiet button, but it has an icon.\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-icon-button--quiet\">\n      <span class=\"topcoat-icon\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n    <button class=\"topcoat-icon-button--quiet\" disabled>\n      <span class=\"topcoat-icon\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - icon\n    - quiet\n*/\n\n.topcoat-icon-button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.topcoat-icon-button--quiet:hover,\n.topcoat-icon-button--large--quiet:hover {\n  text-shadow: 0 1px #fff;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-icon-button--quiet:active,\n.topcoat-icon-button--large--quiet:active {\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  background-color: #d3d7d7;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n/* topdoc\n  name: Large Icon Button\n  description: Like large button, but it has an icon.\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <button class=\"topcoat-icon-button--large\">\n      <span class=\"topcoat-icon--large\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n    <button class=\"topcoat-icon-button--large\" disabled>\n      <span class=\"topcoat-icon--large\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - icon\n    - large\n*/\n\n.topcoat-icon-button--large,\n.topcoat-icon-button--large--quiet {\n  width: 4.375rem;\n  height: 4.375rem;\n  line-height: 4.375rem;\n}\n\n.topcoat-icon-button--large:active {\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n}\n\n/* topdoc\n  name: Large Quiet Icon Button\n  description: Like large button, but it has an icon and this one is quiet.\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n  markup:\n    <button class=\"topcoat-icon-button--large--quiet\">\n      <span class=\"topcoat-icon--large\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n    <button class=\"topcoat-icon-button--large--quiet\" disabled>\n      <span class=\"topcoat-icon--large\" style=\"background-color:#A5A7A7;\"></span>\n    </button>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - button\n    - icon\n    - large\n    - quiet\n*/\n\n.topcoat-icon-button--large--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.topcoat-icon,\n.topcoat-icon--large {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  overflow: hidden;\n  width: 1.62rem;\n  height: 1.62rem;\n  vertical-align: middle;\n  top: -1px;\n}\n\n.topcoat-icon--large {\n  width: 2.499999998125rem;\n  height: 2.499999998125rem;\n  top: -2px;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.input {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  vertical-align: top;\n  outline: none;\n}\n\n.input:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.list {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.list__header {\n  margin: 0;\n}\n\n.list__container {\n  padding: 0;\n  margin: 0;\n  list-style-type: none;\n}\n\n.list__item {\n  margin: 0;\n  padding: 0;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.list,\n.topcoat-list {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  overflow: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.list__header,\n.topcoat-list__header {\n  margin: 0;\n}\n\n.list__container,\n.topcoat-list__container {\n  padding: 0;\n  margin: 0;\n  list-style-type: none;\n}\n\n.list__item,\n.topcoat-list__item {\n  margin: 0;\n  padding: 0;\n}\n\n/* topdoc\n  name: List\n  description: Topcoat default list skin\n  markup:\n    <div class=\"topcoat-list\">\n      <h3 class=\"topcoat-list__header\">Category</h3>\n      <ul class=\"topcoat-list__container\">\n        <li class=\"topcoat-list__item\">\n          Item\n        </li>\n        <li class=\"topcoat-list__item\">\n          Item\n        </li>\n        <li class=\"topcoat-list__item\">\n          Item\n        </li>\n      </ul>\n    </div>\n  tags:\n    - mobile\n    - list\n*/\n\n.topcoat-list {\n  border-top: 1px solid #bcbfbf;\n  border-bottom: 1px solid #eff1f1;\n  background-color: #dfe2e2;\n}\n\n.topcoat-list__header {\n  padding: 4px 20px;\n  font-size: 0.9em;\n  font-weight: 400;\n  background-color: #cccfcf;\n  color: #656565;\n  text-shadow: 0 1px 0 rgba(255,255,255,0.5);\n  border-top: 1px solid rgba(255,255,255,0.5);\n  border-bottom: 1px solid rgba(255,255,255,0.23);\n}\n\n.topcoat-list__container {\n  border-top: 1px solid #bcbfbf;\n  color: #454545;\n}\n\n.topcoat-list__item {\n  padding: 1.25rem;\n  border-top: 1px solid #eff1f1;\n  border-bottom: 1px solid #bcbfbf;\n}\n\n.topcoat-list__item:first-child {\n  border-top: 1px solid rgba(0,0,0,0.05);\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.navigation-bar {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  white-space: nowrap;\n  overflow: hidden;\n  word-spacing: 0;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.navigation-bar__item {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n}\n\n.navigation-bar__title {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.navigation-bar,\n.topcoat-navigation-bar {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  white-space: nowrap;\n  overflow: hidden;\n  word-spacing: 0;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.navigation-bar__item,\n.topcoat-navigation-bar__item {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n}\n\n.navigation-bar__title,\n.topcoat-navigation-bar__title {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n/* topdoc\n  name: Navigation Bar\n  description: A place where navigation goes to drink\n  markup:\n    <div class=\"topcoat-navigation-bar\">\n        <div class=\"topcoat-navigation-bar__item center full\">\n            <h1 class=\"topcoat-navigation-bar__title\">Header</h1>\n        </div>\n    </div>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - navigation\n    - bar\n*/\n\n.topcoat-navigation-bar {\n  height: 4.375rem;\n  padding-left: 1rem;\n  padding-right: 1rem;\n  background: #e5e9e8;\n  color: #000;\n  box-shadow: inset 0 -1px #b9bcbc, 0 1px #d4d6d6;\n}\n\n.topcoat-navigation-bar__item {\n  margin: 0;\n  line-height: 4.375rem;\n  vertical-align: top;\n}\n\n.topcoat-navigation-bar__title {\n  font-size: 1.3rem;\n  font-weight: 400;\n  color: #000;\n}\n\n/*\nCopyright 2012 Adobe Systems Inc.;\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.notification {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n/*\nCopyright 2012 Adobe Systems Inc.;\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.notification,\n.topcoat-notification {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n/* topdoc\n  name: Notification\n  description: Notification badge\n  markup:\n    <span class=\"topcoat-notification\">1</span>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - notification\n*/\n\n.topcoat-notification {\n  padding: 0.15em 0.5em 0.2em;\n  border-radius: 2px;\n  background-color: #ec514e;\n  color: #fff;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\ninput[type=\"radio\"] {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.radio-button {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.radio-button__label {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.radio-button:before,\n.radio-button:after {\n  content: '';\n  position: absolute;\n  border-radius: 100%;\n}\n\n.radio-button:after {\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n}\n\n.radio-button:before {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n.radio-button--disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\ninput[type=\"radio\"] {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.radio-button,\n.topcoat-radio-button__checkmark {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.radio-button__label,\n.topcoat-radio-button {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.radio-button:before,\n.radio-button:after,\n.topcoat-radio-button__checkmark:before,\n.topcoat-radio-button__checkmark:after {\n  content: '';\n  position: absolute;\n  border-radius: 100%;\n}\n\n.radio-button:after,\n.topcoat-radio-button__checkmark:after {\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n}\n\n.radio-button:before,\n.topcoat-radio-button__checkmark:before {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n.radio-button--disabled,\ninput[type=\"radio\"]:disabled + .topcoat-radio-button__checkmark {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Radio Button\n  description: A button that can play music, but usually just plays ads.\n  modifiers:\n  markup:\n    <!-- NO LABEL -->\n    <label class=\"topcoat-radio-button\">\n      <input type=\"radio\" name=\"topcoat\">\n      <div class=\"topcoat-radio-button__checkmark\"></div>\n    </label>\n    <br>\n    <br>\n    <!-- LEFT LABEL -->\n    <label class=\"topcoat-radio-button\">\n      Left label\n      <input type=\"radio\" name=\"topcoat\">\n      <div class=\"topcoat-radio-button__checkmark\"></div>\n    </label>\n    <br>\n    <br>\n    <!-- RIGHT LABEL -->\n    <label class=\"topcoat-radio-button\">\n      <input type=\"radio\" name=\"topcoat\">\n      <div class=\"topcoat-radio-button__checkmark\"></div>\n      Right label\n    </label>\n    <br>\n    <br>\n    <!-- DISABLED -->\n    <label class=\"topcoat-radio-button\">\n      <input type=\"radio\" name=\"topcoat\" Disabled>\n      <div class=\"topcoat-radio-button__checkmark\"></div>\n      Disabled\n    </label>\n  examples:\n    Mobile Radio Button: http://codepen.io/Topcoat/pen/HDcJj\n  tags:\n    - desktop\n    - light\n    - mobile\n    - Radio\n*/\n\ninput[type=\"radio\"] {\n  height: 1.875rem;\n  width: 1.875rem;\n  margin-top: 0;\n  margin-right: -1.875rem;\n  margin-bottom: -1.875rem;\n  margin-left: 0;\n}\n\ninput[type=\"radio\"]:checked + .topcoat-radio-button__checkmark:after {\n  opacity: 1;\n}\n\n.topcoat-radio-button {\n  color: #454545;\n  line-height: 1.875rem;\n}\n\n.topcoat-radio-button__checkmark:before {\n  width: 1.875rem;\n  height: 1.875rem;\n  background: #e5e9e8;\n  border: 1px solid #a5a8a8;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-radio-button__checkmark {\n  position: relative;\n  width: 1.875rem;\n  height: 1.875rem;\n}\n\n.topcoat-radio-button__checkmark:after {\n  opacity: 0;\n  width: 0.875rem;\n  height: 0.875rem;\n  background: #666;\n  border: 1px solid rgba(0,0,0,0.1);\n  box-shadow: 0 1px rgba(255,255,255,0.5);\n  -webkit-transform: none;\n  -ms-transform: none;\n  transform: none;\n  top: 7px;\n  left: 7px;\n}\n\ninput[type=\"radio\"]:focus + .topcoat-radio-button__checkmark:before {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n/*\nCopyright 2012 Adobe Systems Inc.;\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/*\nCopyright 2012 Adobe Systems Inc.;\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n.range {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  vertical-align: top;\n  outline: none;\n  -webkit-appearance: none;\n}\n\n.range__thumb {\n  cursor: pointer;\n}\n\n.range__thumb--webkit {\n  cursor: pointer;\n  -webkit-appearance: none;\n}\n\n.range:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/*\nCopyright 2012 Adobe Systems Inc.;\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/*\nCopyright 2012 Adobe Systems Inc.;\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n.range,\n.topcoat-range {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  vertical-align: top;\n  outline: none;\n  -webkit-appearance: none;\n}\n\n.range__thumb,\n.topcoat-range::-moz-range-thumb {\n  cursor: pointer;\n}\n\n.range__thumb--webkit,\n.topcoat-range::-webkit-slider-thumb {\n  cursor: pointer;\n  -webkit-appearance: none;\n}\n\n.range:disabled,\n.topcoat-range:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Range\n  description: Range input\n  modifiers:\n    :active: Active state\n    :disabled: Disabled state\n    :hover: Hover state\n    :focus: Focused\n  markup:\n    <input type=\"range\" class=\"topcoat-range\">\n    <input type=\"range\" class=\"topcoat-range\" disabled>\n  examples:\n    mobile range: http://codepen.io/Topcoat/pen/BskEn\n  tags:\n    - desktop\n    - mobile\n    - range\n*/\n\n.topcoat-range {\n  border-radius: 6px;\n  border: 1px solid #a5a8a8;\n  background-color: #d3d7d7;\n  height: 1rem;\n  border-radius: 30px;\n}\n\n.topcoat-range::-moz-range-track {\n  border-radius: 6px;\n  border: 1px solid #a5a8a8;\n  background-color: #d3d7d7;\n  height: 1rem;\n  border-radius: 30px;\n}\n\n.topcoat-range::-webkit-slider-thumb {\n  height: 3rem;\n  width: 2rem;\n  background-color: #e5e9e8;\n  border: 1px solid #a5a8a8;\n  border-radius: 6px;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-range::-moz-range-thumb {\n  height: 3rem;\n  width: 2rem;\n  background-color: #e5e9e8;\n  border: 1px solid #a5a8a8;\n  border-radius: 6px;\n  box-shadow: inset 0 1px #fff;\n}\n\n.topcoat-range:focus::-webkit-slider-thumb {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n.topcoat-range:focus::-moz-range-thumb {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.search-input {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  vertical-align: top;\n  outline: none;\n  -webkit-appearance: none;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\n.search-input:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.search-input,\n.topcoat-search-input,\n.topcoat-search-input--large {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  vertical-align: top;\n  outline: none;\n  -webkit-appearance: none;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\n.search-input:disabled,\n.topcoat-search-input:disabled,\n.topcoat-search-input--large:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Search Input\n  description: A text input designed for searching.\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <input type=\"search\" value=\"\" placeholder=\"search\" class=\"topcoat-search-input\">\n    <input type=\"search\" value=\"\" placeholder=\"search\" class=\"topcoat-search-input\" disabled>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - text\n    - input\n    - search\n    - form\n*/\n\n.topcoat-search-input,\n.topcoat-search-input--large {\n  line-height: 3rem;\n  font-size: 16px;\n  border: 1px solid #a5a8a8;\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n  color: #454545;\n  padding: 0 0 0 2rem;\n  border-radius: 30px;\n  background-image: url(\"../img/search.svg\");\n  background-position: 1em center;\n  background-repeat: no-repeat;\n  background-size: 16px;\n}\n\n.topcoat-search-input:focus,\n.topcoat-search-input--large:focus {\n  background-image: url(\"../img/search_dark.svg\");\n  background-color: #edf1f1;\n  color: #000;\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n.topcoat-search-input::-webkit-search-cancel-button,\n.topcoat-search-input::-webkit-search-decoration,\n.topcoat-search-input--large::-webkit-search-cancel-button,\n.topcoat-search-input--large::-webkit-search-decoration {\n  margin-right: 5px;\n}\n\n.topcoat-search-input:focus::-webkit-input-placeholder,\n.topcoat-search-input:focus::-webkit-input-placeholder {\n  color: #c6c8c8;\n}\n\n.topcoat-search-input:disabled::-webkit-input-placeholder {\n  color: #000;\n}\n\n.topcoat-search-input:disabled::-moz-placeholder {\n  color: #000;\n}\n\n.topcoat-search-input:disabled:-ms-input-placeholder {\n  color: #000;\n}\n\n/* topdoc\n  name: Large Search Input\n  description: A large text input designed for searching.\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <input type=\"search\" value=\"\" placeholder=\"search\" class=\"topcoat-search-input--large\">\n    <input type=\"search\" value=\"\" placeholder=\"search\" class=\"topcoat-search-input--large\" disabled>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - text\n    - input\n    - search\n    - form\n    - large\n*/\n\n.topcoat-search-input--large {\n  line-height: 4.375rem;\n  font-size: 1.3rem;\n  font-weight: 200;\n  padding: 0 0 0 2.9rem;\n  border-radius: 40px;\n  background-position: 1.2em center;\n  background-size: 1.3rem;\n}\n\n.topcoat-search-input--large:disabled {\n  color: #000;\n}\n\n.topcoat-search-input--large:disabled::-webkit-input-placeholder {\n  color: #000;\n}\n\n.topcoat-search-input--large:disabled::-moz-placeholder {\n  color: #000;\n}\n\n.topcoat-search-input--large:disabled:-ms-input-placeholder {\n  color: #000;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.switch {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n.switch__input {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.switch__toggle {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.switch__toggle:before,\n.switch__toggle:after {\n  content: '';\n  position: absolute;\n  z-index: -1;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n.switch--disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.switch,\n.topcoat-switch {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n.switch__input,\n.topcoat-switch__input {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.switch__toggle,\n.topcoat-switch__toggle {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.switch__toggle:before,\n.switch__toggle:after,\n.topcoat-switch__toggle:before,\n.topcoat-switch__toggle:after {\n  content: '';\n  position: absolute;\n  z-index: -1;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n}\n\n.switch--disabled,\n.topcoat-switch__input:disabled + .topcoat-switch__toggle {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Switch\n  description: Default skin for Topcoat switch\n  modifiers:\n    :focus: Focus state\n    :disabled: Disabled state\n  markup:\n    <label class=\"topcoat-switch\">\n      <input type=\"checkbox\" class=\"topcoat-switch__input\">\n      <div class=\"topcoat-switch__toggle\"></div>\n    </label>\n    <br>\n    <br>\n    <label class=\"topcoat-switch\">\n      <input type=\"checkbox\" class=\"topcoat-switch__input\" checked>\n      <div class=\"topcoat-switch__toggle\"></div>\n    </label>\n    <br>\n    <br>\n    <label class=\"topcoat-switch\">\n      <input type=\"checkbox\" class=\"topcoat-switch__input\" disabled>\n      <div class=\"topcoat-switch__toggle\"></div>\n    </label>\n  examples:\n    mobile switch: http://codepen.io/Topcoat/pen/upxds\n  tags:\n    - desktop\n    - light\n    - mobile\n    - switch\n*/\n\n.topcoat-switch {\n  font-size: 16px;\n  padding: 0 1.25rem;\n  border-radius: 6px;\n  border: 1px solid #a5a8a8;\n  overflow: hidden;\n  width: 6rem;\n}\n\n.topcoat-switch__toggle:before,\n.topcoat-switch__toggle:after {\n  top: -1px;\n  width: 5rem;\n}\n\n.topcoat-switch__toggle:before {\n  content: 'ON';\n  color: #0083e8;\n  background-color: #e0f0fa;\n  right: 1rem;\n  padding-left: 1.5rem;\n}\n\n.topcoat-switch__toggle {\n  line-height: 3rem;\n  height: 3rem;\n  width: 2rem;\n  border-radius: 6px;\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  background-color: #e5e9e8;\n  border: 1px solid #a5a8a8;\n  margin-left: -1.3rem;\n  margin-bottom: -1px;\n  margin-top: -1px;\n  box-shadow: inset 0 1px #fff;\n  -webkit-transition: margin-left 0.05s ease-in-out;\n  transition: margin-left 0.05s ease-in-out;\n}\n\n.topcoat-switch__toggle:after {\n  content: 'OFF';\n  background-color: #d3d7d7;\n  left: 1rem;\n  padding-left: 2rem;\n}\n\n.topcoat-switch__input:checked + .topcoat-switch__toggle {\n  margin-left: 2.7rem;\n}\n\n.topcoat-switch__input:focus + .topcoat-switch__toggle {\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n.topcoat-switch__input:disabled + .topcoat-switch__toggle:after,\n.topcoat-switch__input:disabled + .topcoat-switch__toggle:before {\n  background: transparent;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.button,\n.topcoat-tab-bar__button {\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  text-decoration: none;\n}\n\n.button--quiet {\n  background: transparent;\n  border: 1px solid transparent;\n  box-shadow: none;\n}\n\n.button--disabled,\n.topcoat-tab-bar__button:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n.button-bar,\n.topcoat-tab-bar {\n  display: table;\n  table-layout: fixed;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n}\n\n.button-bar__item,\n.topcoat-tab-bar__item {\n  display: table-cell;\n  width: auto;\n  border-radius: 0;\n}\n\n.button-bar__item > input,\n.topcoat-tab-bar__item > input {\n  position: absolute;\n  overflow: hidden;\n  padding: 0;\n  border: 0;\n  opacity: 0.001;\n  z-index: 1;\n  vertical-align: top;\n  outline: none;\n}\n\n.button-bar__button {\n  border-radius: inherit;\n}\n\n.button-bar__item:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Tab Bar\n  description: Component of tab buttons\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <div class=\"topcoat-tab-bar\">\n      <label class=\"topcoat-tab-bar__item\">\n        <input type=\"radio\" name=\"tab-bar\">\n        <button class=\"topcoat-tab-bar__button\">One</button>\n      </label>\n      <label class=\"topcoat-tab-bar__item\">\n        <input type=\"radio\" name=\"tab-bar\">\n        <button class=\"topcoat-tab-bar__button\">Two</button>\n      </label>\n      <label class=\"topcoat-tab-bar__item\">\n        <input type=\"radio\" name=\"tab-bar\">\n        <button class=\"topcoat-tab-bar__button\">Three</button>\n      </label>\n    </div>\n  examples:\n    mobile tab bar: http://codepen.io/Topcoat/pen/rJICF\n  tags:\n    - desktop\n    - light\n    - dark\n    - mobile\n    - tab\n    - group\n    - bar\n*/\n\n.topcoat-tab-bar__button {\n  padding: 0 1.25rem;\n  height: 3rem;\n  line-height: 3rem;\n  letter-spacing: 1px;\n  color: #454545;\n  text-shadow: 0 1px #fff;\n  vertical-align: top;\n  background-color: #e5e9e8;\n  box-shadow: inset 0 1px #fff;\n  border-top: 1px solid #a5a8a8;\n}\n\n.topcoat-tab-bar__button:active,\n.topcoat-tab-bar__button--large:active,\n:checked + .topcoat-tab-bar__button {\n  color: #0083e8;\n  background-color: #e0f0fa;\n  box-shadow: inset 0 0 2px #c0ced8;\n}\n\n.topcoat-tab-bar__button:focus,\n.topcoat-tab-bar__button--large:focus {\n  z-index: 1;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.input,\n.topcoat-text-input,\n.topcoat-text-input--large {\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  vertical-align: top;\n  outline: none;\n}\n\n.input:disabled,\n.topcoat-text-input:disabled,\n.topcoat-text-input--large:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Text input\n  description: Topdoc text input\n  modifiers:\n    :disabled: Disabled state\n    :focus: Focused\n    :invalid: Hover state\n  markup:\n    <input type=\"text\" class=\"topcoat-text-input\" placeholder=\"text\" value=\"\">\n    <br>\n    <br>\n    <input type=\"text\" class=\"topcoat-text-input\" placeholder=\"text\" value=\"\" disabled>\n    <br>\n    <br>\n    <input type=\"text\" class=\"topcoat-text-input\" placeholder=\"text\" value=\"fail\" pattern=\"not-fail\">\n  tags:\n    - desktop\n    - mobile\n    - text\n    - input\n*/\n\n.topcoat-text-input,\n.topcoat-text-input--large {\n  line-height: 3rem;\n  font-size: 16px;\n  letter-spacing: 1px;\n  padding: 0 1.25rem;\n  border: 1px solid #a5a8a8;\n  border-radius: 6px;\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n  color: #454545;\n  vertical-align: top;\n}\n\n.topcoat-text-input:focus,\n.topcoat-text-input--large:focus {\n  background-color: #edf1f1;\n  color: #000;\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n.topcoat-text-input:disabled::-webkit-input-placeholder {\n  color: #000;\n}\n\n.topcoat-text-input:disabled::-moz-placeholder {\n  color: #000;\n}\n\n.topcoat-text-input:disabled:-ms-input-placeholder {\n  color: #000;\n}\n\n.topcoat-text-input:invalid {\n  border: 1px solid #d83b75;\n}\n\n/* topdoc\n  name: Large Text Input\n  description: A bigger input, still for text.\n  modifiers:\n    :disabled: Disabled state\n    :focus: Focused\n    :invalid: Hover state\n  markup:\n    <input type=\"text\" class=\"topcoat-text-input--large\" value=\"\" placeholder=\"text\">\n    <br>\n    <br>\n    <input type=\"text\" class=\"topcoat-text-input--large\" value=\"\" placeholder=\"text\" disabled>\n    <br>\n    <br>\n    <input type=\"text\" class=\"topcoat-text-input--large\" placeholder=\"text\" value=\"fail\" pattern=\"not-fail\">\n  tags:\n    - desktop\n    - light\n    - mobile\n    - form\n    - input\n    - large\n*/\n\n.topcoat-text-input--large {\n  line-height: 4.375rem;\n  font-size: 1.3rem;\n}\n\n.topcoat-text-input--large:disabled {\n  color: #000;\n}\n\n.topcoat-text-input--large:disabled::-webkit-input-placeholder {\n  color: #000;\n}\n\n.topcoat-text-input--large:disabled::-moz-placeholder {\n  color: #000;\n}\n\n.topcoat-text-input--large:disabled:-ms-input-placeholder {\n  color: #000;\n}\n\n.topcoat-text-input--large:invalid {\n  border: 1px solid #d83b75;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.textarea {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  vertical-align: top;\n  resize: none;\n  outline: none;\n}\n\n.textarea:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n/**\n*\n* Copyright 2012 Adobe Systems Inc.;\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*\n*/\n\n.textarea,\n.topcoat-textarea,\n.topcoat-textarea--large {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  vertical-align: top;\n  resize: none;\n  outline: none;\n}\n\n.textarea:disabled,\n.topcoat-textarea:disabled,\n.topcoat-textarea--large:disabled {\n  opacity: 0.3;\n  cursor: default;\n  pointer-events: none;\n}\n\n/* topdoc\n  name: Textarea\n  description: A whole area, just for text.\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <textarea class=\"topcoat-textarea\" rows=\"6\" cols=\"36\" placeholder=\"Textarea\"></textarea>\n    <br>\n    <br>\n    <textarea class=\"topcoat-textarea\" rows=\"6\" cols=\"36\" placeholder=\"Textarea\" disabled></textarea>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - form\n    - input\n    - textarea\n*/\n\n.topcoat-textarea,\n.topcoat-textarea--large {\n  padding: 2rem;\n  font-size: 2.5rem;\n  font-weight: 200;\n  border-radius: 6px;\n  line-height: 3rem;\n  border: 1px solid #a5a8a8;\n  background-color: #d3d7d7;\n  box-shadow: inset 0 1px rgba(0,0,0,0.12);\n  color: #454545;\n  letter-spacing: 1px;\n}\n\n.topcoat-textarea:focus,\n.topcoat-textarea--large:focus {\n  background-color: #edf1f1;\n  color: #000;\n  border: 1px solid #0940fd;\n  box-shadow: 0 0 0 2px #6fb5f1;\n}\n\n.topcoat-textarea:disabled::-webkit-input-placeholder {\n  color: #000;\n}\n\n.topcoat-textarea:disabled::-moz-placeholder {\n  color: #000;\n}\n\n.topcoat-textarea:disabled:-ms-input-placeholder {\n  color: #000;\n}\n\n/* topdoc\n  name: Large Textarea\n  description: A whole area, just for text; now available in large.\n  modifiers:\n    :disabled: Disabled state\n  markup:\n    <textarea class=\"topcoat-textarea--large\" rows=\"6\" cols=\"36\" placeholder=\"Textarea\"></textarea>\n    <br>\n    <br>\n    <textarea class=\"topcoat-textarea--large\" rows=\"6\" cols=\"36\" placeholder=\"Textarea\" disabled></textarea>\n  tags:\n    - desktop\n    - light\n    - mobile\n    - form\n    - input\n    - textarea\n*/\n\n.topcoat-textarea--large {\n  font-size: 3rem;\n  line-height: 4.375rem;\n}\n\n.topcoat-textarea--large:disabled {\n  color: #000;\n}\n\n.topcoat-textarea--large:disabled::-webkit-input-placeholder {\n  color: #000;\n}\n\n.topcoat-textarea--large:disabled::-moz-placeholder {\n  color: #000;\n}\n\n.topcoat-textarea--large:disabled:-ms-input-placeholder {\n  color: #000;\n}\n\n@font-face {\n  font-family: \"Source Sans\";\n  src: url(\"../font/SourceSansPro-Regular.otf\");\n}\n\n@font-face {\n  font-family: \"Source Sans\";\n  src: url(\"../font/SourceSansPro-Light.otf\");\n  font-weight: 200;\n}\n\n@font-face {\n  font-family: \"Source Sans\";\n  src: url(\"../font/SourceSansPro-Semibold.otf\");\n  font-weight: 600;\n}\n\nbody {\n  margin: 0;\n  padding: 0;\n  background: #dfe2e2;\n  color: #000;\n  font: 16px \"Source Sans\", helvetica, arial, sans-serif;\n  font-weight: 200;\n}\n\n:focus {\n  outline-color: transparent;\n  outline-style: none;\n}\n\n.topcoat-icon--menu-stack {\n  background: url(\"../img/hamburger_dark.svg\") no-repeat;\n  background-size: cover;\n}\n\n.quarter {\n  width: 25%;\n}\n\n.half {\n  width: 50%;\n}\n\n.three-quarters {\n  width: 75%;\n}\n\n.third {\n  width: 33.333%;\n}\n\n.two-thirds {\n  width: 66.666%;\n}\n\n.full {\n  width: 100%;\n}\n\n.left {\n  text-align: left;\n}\n\n.center {\n  text-align: center;\n}\n\n.right {\n  text-align: right;\n}\n\n.reset-ui {\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  background-clip: padding-box;\n  position: relative;\n  display: inline-block;\n  vertical-align: top;\n  padding: 0;\n  margin: 0;\n  font: inherit;\n  color: inherit;\n  background: transparent;\n  border: none;\n  cursor: default;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n}\n\n/* This file should include color and image variables corresponding to the dark theme */\n\n/* Call To Action */\n\n/* Icons */\n\n/* Navigation Bar */\n\n/* Text Input */\n\n/* Search Input */\n\n/* List */\n\n/* Checkbox */\n\n/* Overlay */\n\n/* Progress bar */\n\n/* Checkbox */\n\n/* Radio Button */\n\n/* Tab bar */\n\n/* Switch */\n\n/* Icon Button */\n\n/* Navigation bar */\n\n/* List */\n\n/* Search Input */\n\n/* Textarea */\n\n/* Checkbox */\n\n/* Radio */\n\n/* Range input */\n\n/* Search Input */\n\n/* Switch */\n\n/* This file should include color and image variables corresponding to the light theme */\n\n/* Call To Action */\n\n/* Icons */\n\n/* Navigation Bar */\n\n/* Text Input */\n\n/* List */\n\n/* Overlay */\n\n/* Progress bar */\n\n/* Checkbox */\n\n/* Range input */\n\n/* Radio Button */\n\n/* Tab bar */\n\n/* Switch */\n\n/* Containers */\n\n/* Icon Button */\n\n/* Navigation bar */\n\n/* List */\n\n/* Search Input */\n\n/* Text Area */\n\n/* Checkbox */\n\n/* Radio */\n\n/* Range input */\n\n/* Search Input */\n\n/* Switch */\n\n/* Text Input */\n\n/* Radio input */\n\n/* Overlay */\n\n/* Textarea */\n\n/* Progress bar container */\n\n/* Progress bar progress */\n\n/* Search input */\n\n/* Switch */\n\n/* Notification */"
  },
  {
    "path": "doc/fonts/stylesheet.css",
    "content": "\n@font-face {\n    font-family: 'source-sans-pro';\n    src: url('sourcesanspro-light-webfont.eot');\n    src: url('sourcesanspro-light-webfont.eot?#iefix') format('embedded-opentype'),\n         url('sourcesanspro-light-webfont.woff') format('woff'),\n         url('sourcesanspro-light-webfont.ttf') format('truetype'),\n         url('sourcesanspro-light-webfont.svg#source_sans_prolight') format('svg');\n    font-weight: 300;\n    font-style: normal;\n\n}\n\n\n\n\n@font-face {\n    font-family: 'source-sans-pro';\n    src: url('sourcesanspro-regular-webfont.eot');\n    src: url('sourcesanspro-regular-webfont.eot?#iefix') format('embedded-opentype'),\n         url('sourcesanspro-regular-webfont.woff') format('woff'),\n         url('sourcesanspro-regular-webfont.ttf') format('truetype'),\n         url('sourcesanspro-regular-webfont.svg#source_sans_proregular') format('svg');\n    font-weight: 400;\n    font-style: normal;\n\n}\n\n\n\n\n@font-face {\n    font-family: 'source-sans-pro';\n    src: url('sourcesanspro-semibold-webfont.eot');\n    src: url('sourcesanspro-semibold-webfont.eot?#iefix') format('embedded-opentype'),\n         url('sourcesanspro-semibold-webfont.woff') format('woff'),\n         url('sourcesanspro-semibold-webfont.ttf') format('truetype'),\n         url('sourcesanspro-semibold-webfont.svg#source_sans_prosemibold') format('svg');\n    font-weight: 600;\n    font-style: normal;\n\n}\n\n\n\n\n@font-face {\n    font-family: 'source-code-pro';\n    src: url('sourcecodepro-regular-webfont.eot');\n    src: url('sourcecodepro-regular-webfont.eot?#iefix') format('embedded-opentype'),\n         url('sourcecodepro-regular-webfont.woff') format('woff'),\n         url('sourcecodepro-regular-webfont.ttf') format('truetype'),\n         url('sourcecodepro-regular-webfont.svg#source_code_proregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}"
  },
  {
    "path": "doc/js/prism.js",
    "content": "/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou http://lea.verou.me\n */(function(){var e=/\\blang(?:uage)?-(?!\\*)(\\w+)\\b/i,t=self.Prism={util:{type:function(e){return Object.prototype.toString.call(e).match(/\\[object (\\w+)\\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case\"Object\":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case\"Array\":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e],o={};for(var u in s)if(s.hasOwnProperty(u)){if(u==n)for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);o[u]=s[u]}return i[e]=o},DFS:function(e,n){for(var r in e){n.call(e,r,e[r]);t.util.type(e)===\"Object\"&&t.languages.DFS(e[r],n)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,\"\"])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+o);var f=r.textContent;if(!f)return;f=f.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\u00a0/g,\" \");var l={element:r,language:o,grammar:u,code:f};t.hooks.run(\"before-highlight\",l);if(i&&self.Worker){var c=new Worker(t.filename);c.onmessage=function(e){l.highlightedCode=n.stringify(JSON.parse(e.data),o);t.hooks.run(\"before-insert\",l);l.element.innerHTML=l.highlightedCode;s&&s.call(l.element);t.hooks.run(\"after-highlight\",l)};c.postMessage(JSON.stringify({language:l.language,code:l.code}))}else{l.highlightedCode=t.highlight(l.code,l.grammar,l.language);t.hooks.run(\"before-insert\",l);l.element.innerHTML=l.highlightedCode;s&&s.call(r);t.hooks.run(\"after-highlight\",l)}},highlight:function(e,r,i){return n.stringify(t.tokenize(e,r),i)},tokenize:function(e,n,r){var i=t.Token,s=[e],o=n.rest;if(o){for(var u in o)n[u]=o[u];delete n.rest}e:for(var u in n){if(!n.hasOwnProperty(u)||!n[u])continue;var a=n[u],f=a.inside,l=!!a.lookbehind,c=0;a=a.pattern||a;for(var h=0;h<s.length;h++){var p=s[h];if(s.length>e.length)break e;if(p instanceof i)continue;a.lastIndex=0;var d=a.exec(p);if(d){l&&(c=d[1].length);var v=d.index-1+c,d=d[0].slice(c),m=d.length,g=v+m,y=p.slice(0,v+1),b=p.slice(g+1),w=[h,1];y&&w.push(y);var E=new i(u,f?t.tokenize(d,f):d);w.push(E);b&&w.push(b);Array.prototype.splice.apply(s,w)}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e,r,i){if(typeof e==\"string\")return e;if(Object.prototype.toString.call(e)==\"[object Array]\")return e.map(function(t){return n.stringify(t,r,e)}).join(\"\");var s={type:e.type,content:n.stringify(e.content,r,i),tag:\"span\",classes:[\"token\",e.type],attributes:{},language:r,parent:i};s.type==\"comment\"&&(s.attributes.spellcheck=\"true\");t.hooks.run(\"wrap\",s);var o=\"\";for(var u in s.attributes)o+=u+'=\"'+(s.attributes[u]||\"\")+'\"';return\"<\"+s.tag+' class=\"'+s.classes.join(\" \")+'\" '+o+\">\"+s.content+\"</\"+s.tag+\">\"};if(!self.document){self.addEventListener(\"message\",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.tokenize(i,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName(\"script\");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute(\"data-manual\")&&document.addEventListener(\"DOMContentLoaded\",t.highlightAll)}})();;\nPrism.languages.clike={comment:{pattern:/(^|[^\\\\])(\\/\\*[\\w\\W]*?\\*\\/|(^|[^:])\\/\\/.*?(\\r?\\n|$))/g,lookbehind:!0},string:/(\"|')(\\\\?.)*?\\1/g,\"class-name\":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[a-z0-9_\\.\\\\]+/ig,lookbehind:!0,inside:{punctuation:/(\\.|\\\\)/}},keyword:/\\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/g,\"boolean\":/\\b(true|false)\\b/g,\"function\":{pattern:/[a-z0-9_]+\\(/ig,inside:{punctuation:/\\(/}}, number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/g,operator:/[-+]{1,2}|!|&lt;=?|>=?|={1,3}|(&amp;){1,2}|\\|?\\||\\?|\\*|\\/|\\~|\\^|\\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\\];(),.:]/g};\n;\nPrism.languages.javascript=Prism.languages.extend(\"clike\",{keyword:/\\b(var|let|if|else|while|do|for|return|in|instanceof|function|new|with|typeof|try|throw|catch|finally|null|break|continue)\\b/g,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?|NaN|-?Infinity)\\b/g});Prism.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:/(^|[^/])\\/(?!\\/)(\\[.+?]|\\\\.|[^/\\r\\n])+\\/[gim]{0,3}(?=\\s*($|[\\r\\n,.;})]))/g,lookbehind:!0}});Prism.languages.markup&&Prism.languages.insertBefore(\"markup\",\"tag\",{script:{pattern:/(&lt;|<)script[\\w\\W]*?(>|&gt;)[\\w\\W]*?(&lt;|<)\\/script(>|&gt;)/ig,inside:{tag:{pattern:/(&lt;|<)script[\\w\\W]*?(>|&gt;)|(&lt;|<)\\/script(>|&gt;)/ig,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});\n;"
  },
  {
    "path": "doc/reference.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n        <base href=\"http://snapsvg.io/docs/\">\n        <title>Snap.svg API Reference</title>\n        <link rel=\"shortcut icon\" href=\"/assets/favicon.ico?v=1\">\n        <meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/fonts/stylesheet.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/css/main.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/css/dr.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/css/prism.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/style/docs-header.css?v=201311041519\">\n        <script>\n            var _gaq = _gaq || [];\n            _gaq.push(['_setAccount', 'UA-44948757-1']);\n            _gaq.push(['_trackPageview']);\n            (function() {\n                var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n                ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n                var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n            })();\n            function trackOutboundLink(link, category, action) {\n                try {\n                    _gaq.push(['_trackEvent', category , action]);\n                } catch(err){}\n                setTimeout(function() {\n                    document.location.href = link.href;\n                }, 100);\n            }\n        </script>\n    </head>\n    <body class=\"light\">\n        <header id=\"header\">\n            <div class=\"wrap\">\n                <a href=\"/\" class=\"logo\">\n                    <img src=\"/assets/images/logo.svg\" alt=\"\" />\n                    <span class=\"header\">Snap.svg</span>\n                </a>\n                <nav>\n                    <a href=\"/\">Home</a>\n                    <a href=\"/about/\">Why Snap</a>\n                    <a href=\"/start/\" class=\"mobile-hide\">Getting Started</a>\n                    <a href=\"/docs/\" class=\"mobile-hide selected\">Docs</a>\n                    <a href=\"/support/\">Support</a>\n                    <a href=\"/demos/\" class=\"mobile-hide\">Demos</a>\n                    <a class=\"bt\" href=\"/assets/downloads/Snap.svg-0.5.0.zip\" onclick=\"trackOutboundLink(this, 'Download', '0.5.0');return false;\">Download</a>\n                </nav>\n            </div>\n        </header>\n        <!--[if lt IE 9]>\n<script src=\"//html5shiv.googlecode.com/svn/trunk/html5.js\"></script><![endif]-->\n        <div id=\"wrapper\">\n            <div class=\"max-width\">\n                <div id=\"sideNav\">\n                    <div class=\"combo\">\n                        <input type=\"search\" id=\"dr-filter\" value=\"\" placeholder=\"search\">\n                    </div>\n                    <div id=\"pageNav\">\n                        <ol id=\"dr-toc\">\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#Element\" class=\"undefined\">\n                                    <span>Element</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.add\" class=\"dr-method\">\n                                    <span>Element.add()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.addClass\" class=\"dr-method\">\n                                    <span>Element.addClass()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.addStop\" class=\"dr-method\">\n                                    <span>Element.addStop()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.after\" class=\"dr-method\">\n                                    <span>Element.after()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.animate\" class=\"dr-method\">\n                                    <span>Element.animate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.append\" class=\"dr-method\">\n                                    <span>Element.append()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.appendTo\" class=\"dr-method\">\n                                    <span>Element.appendTo()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.asPX\" class=\"dr-method\">\n                                    <span>Element.asPX()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.attr\" class=\"dr-method\">\n                                    <span>Element.attr()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.before\" class=\"dr-method\">\n                                    <span>Element.before()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.children\" class=\"dr-method\">\n                                    <span>Element.children()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.click\" class=\"dr-method\">\n                                    <span>Element.click()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.clone\" class=\"dr-method\">\n                                    <span>Element.clone()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.data\" class=\"dr-method\">\n                                    <span>Element.data()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.dblclick\" class=\"dr-method\">\n                                    <span>Element.dblclick()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.drag\" class=\"dr-method\">\n                                    <span>Element.drag()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.getBBox\" class=\"dr-method\">\n                                    <span>Element.getBBox()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.getPointAtLength\" class=\"dr-method\">\n                                    <span>Element.getPointAtLength()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.getSubpath\" class=\"dr-method\">\n                                    <span>Element.getSubpath()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.getTotalLength\" class=\"dr-method\">\n                                    <span>Element.getTotalLength()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.hasClass\" class=\"dr-method\">\n                                    <span>Element.hasClass()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.hover\" class=\"dr-method\">\n                                    <span>Element.hover()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.inAnim\" class=\"dr-method\">\n                                    <span>Element.inAnim()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.innerSVG\" class=\"dr-method\">\n                                    <span>Element.innerSVG()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.insertAfter\" class=\"dr-method\">\n                                    <span>Element.insertAfter()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.insertBefore\" class=\"dr-method\">\n                                    <span>Element.insertBefore()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.marker\" class=\"dr-method\">\n                                    <span>Element.marker()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.mousedown\" class=\"dr-method\">\n                                    <span>Element.mousedown()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.mousemove\" class=\"dr-method\">\n                                    <span>Element.mousemove()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.mouseout\" class=\"dr-method\">\n                                    <span>Element.mouseout()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.mouseover\" class=\"dr-method\">\n                                    <span>Element.mouseover()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.mouseup\" class=\"dr-method\">\n                                    <span>Element.mouseup()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.node\" class=\"dr-property\">\n                                    <span>Element.node</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.outerSVG\" class=\"dr-method\">\n                                    <span>Element.outerSVG()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.parent\" class=\"dr-method\">\n                                    <span>Element.parent()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.prepend\" class=\"dr-method\">\n                                    <span>Element.prepend()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.prependTo\" class=\"dr-method\">\n                                    <span>Element.prependTo()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.remove\" class=\"dr-method\">\n                                    <span>Element.remove()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.removeClass\" class=\"dr-method\">\n                                    <span>Element.removeClass()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.removeData\" class=\"dr-method\">\n                                    <span>Element.removeData()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.select\" class=\"dr-method\">\n                                    <span>Element.select()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.selectAll\" class=\"dr-method\">\n                                    <span>Element.selectAll()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.setStops\" class=\"dr-method\">\n                                    <span>Element.setStops()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.stop\" class=\"dr-method\">\n                                    <span>Element.stop()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.stops\" class=\"dr-method\">\n                                    <span>Element.stops()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.toDefs\" class=\"dr-method\">\n                                    <span>Element.toDefs()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.toJSON\" class=\"dr-method\">\n                                    <span>Element.toJSON()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.toPattern\" class=\"dr-method\">\n                                    <span>Element.toPattern()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.toString\" class=\"dr-method\">\n                                    <span>Element.toString()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.toggleClass\" class=\"dr-method\">\n                                    <span>Element.toggleClass()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.touchcancel\" class=\"dr-method\">\n                                    <span>Element.touchcancel()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.touchend\" class=\"dr-method\">\n                                    <span>Element.touchend()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.touchmove\" class=\"dr-method\">\n                                    <span>Element.touchmove()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.touchstart\" class=\"dr-method\">\n                                    <span>Element.touchstart()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.transform\" class=\"dr-method\">\n                                    <span>Element.transform()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.type\" class=\"dr-property\">\n                                    <span>Element.type</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unclick\" class=\"dr-method\">\n                                    <span>Element.unclick()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.undblclick\" class=\"dr-method\">\n                                    <span>Element.undblclick()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.undrag\" class=\"dr-method\">\n                                    <span>Element.undrag()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unhover\" class=\"dr-method\">\n                                    <span>Element.unhover()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unmousedown\" class=\"dr-method\">\n                                    <span>Element.unmousedown()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unmousemove\" class=\"dr-method\">\n                                    <span>Element.unmousemove()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unmouseout\" class=\"dr-method\">\n                                    <span>Element.unmouseout()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unmouseover\" class=\"dr-method\">\n                                    <span>Element.unmouseover()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.unmouseup\" class=\"dr-method\">\n                                    <span>Element.unmouseup()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.untouchcancel\" class=\"dr-method\">\n                                    <span>Element.untouchcancel()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.untouchend\" class=\"dr-method\">\n                                    <span>Element.untouchend()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.untouchmove\" class=\"dr-method\">\n                                    <span>Element.untouchmove()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.untouchstart\" class=\"dr-method\">\n                                    <span>Element.untouchstart()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Element.use\" class=\"dr-method\">\n                                    <span>Element.use()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#Fragment\" class=\"undefined\">\n                                    <span>Fragment</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Fragment.select\" class=\"dr-method\">\n                                    <span>Fragment.select()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Fragment.selectAll\" class=\"dr-method\">\n                                    <span>Fragment.selectAll()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#Matrix\" class=\"undefined\">\n                                    <span>Matrix</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.add\" class=\"dr-method\">\n                                    <span>Matrix.add()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.clone\" class=\"dr-method\">\n                                    <span>Matrix.clone()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.determinant\" class=\"dr-method\">\n                                    <span>Matrix.determinant()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.invert\" class=\"dr-method\">\n                                    <span>Matrix.invert()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.multLeft\" class=\"dr-method\">\n                                    <span>Matrix.multLeft()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.rotate\" class=\"dr-method\">\n                                    <span>Matrix.rotate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.scale\" class=\"dr-method\">\n                                    <span>Matrix.scale()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.skew\" class=\"dr-method\">\n                                    <span>Matrix.skew()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.skewX\" class=\"dr-method\">\n                                    <span>Matrix.skewX()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.skewY\" class=\"dr-method\">\n                                    <span>Matrix.skewY()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.split\" class=\"dr-method\">\n                                    <span>Matrix.split()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.toTransformString\" class=\"dr-method\">\n                                    <span>Matrix.toTransformString()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.translate\" class=\"dr-method\">\n                                    <span>Matrix.translate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.x\" class=\"dr-method\">\n                                    <span>Matrix.x()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Matrix.y\" class=\"dr-method\">\n                                    <span>Matrix.y()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#Paper\" class=\"undefined\">\n                                    <span>Paper</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.circle\" class=\"dr-method\">\n                                    <span>Paper.circle()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.clear\" class=\"dr-method\">\n                                    <span>Paper.clear()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.el\" class=\"dr-method\">\n                                    <span>Paper.el()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.ellipse\" class=\"dr-method\">\n                                    <span>Paper.ellipse()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.filter\" class=\"dr-method\">\n                                    <span>Paper.filter()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.g\" class=\"dr-method\">\n                                    <span>Paper.g()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.gradient\" class=\"dr-method\">\n                                    <span>Paper.gradient()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.group\" class=\"dr-method\">\n                                    <span>Paper.group()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.image\" class=\"dr-method\">\n                                    <span>Paper.image()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.line\" class=\"dr-method\">\n                                    <span>Paper.line()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.mask\" class=\"dr-method\">\n                                    <span>Paper.mask()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.path\" class=\"dr-method\">\n                                    <span>Paper.path()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.polygon\" class=\"dr-method\">\n                                    <span>Paper.polygon()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.polyline\" class=\"dr-method\">\n                                    <span>Paper.polyline()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.ptrn\" class=\"dr-method\">\n                                    <span>Paper.ptrn()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.rect\" class=\"dr-method\">\n                                    <span>Paper.rect()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.svg\" class=\"dr-method\">\n                                    <span>Paper.svg()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.symbol\" class=\"dr-method\">\n                                    <span>Paper.symbol()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.text\" class=\"dr-method\">\n                                    <span>Paper.text()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.toDataURL\" class=\"dr-method\">\n                                    <span>Paper.toDataURL()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.toString\" class=\"dr-method\">\n                                    <span>Paper.toString()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Paper.use\" class=\"dr-method\">\n                                    <span>Paper.use()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#Set\" class=\"undefined\">\n                                    <span>Set</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.animate\" class=\"dr-method\">\n                                    <span>Set.animate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.attr\" class=\"dr-method\">\n                                    <span>Set.attr()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.bind\" class=\"dr-method\">\n                                    <span>Set.bind()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.clear\" class=\"dr-method\">\n                                    <span>Set.clear()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.exclude\" class=\"dr-method\">\n                                    <span>Set.exclude()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.forEach\" class=\"dr-method\">\n                                    <span>Set.forEach()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.getBBox\" class=\"dr-method\">\n                                    <span>Set.getBBox()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.insertAfter\" class=\"dr-method\">\n                                    <span>Set.insertAfter()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.pop\" class=\"dr-method\">\n                                    <span>Set.pop()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.push\" class=\"dr-method\">\n                                    <span>Set.push()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.remove\" class=\"dr-method\">\n                                    <span>Set.remove()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Set.splice\" class=\"dr-method\">\n                                    <span>Set.splice()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#Snap\" class=\"undefined\">\n                                    <span>Snap</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.Matrix\" class=\"dr-method\">\n                                    <span>Snap.Matrix()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.Set\" class=\"dr-property\">\n                                    <span>Snap.Set</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.acos\" class=\"dr-method\">\n                                    <span>Snap.acos()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.ajax\" class=\"dr-method\">\n                                    <span>Snap.ajax()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.angle\" class=\"dr-method\">\n                                    <span>Snap.angle()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.animate\" class=\"dr-method\">\n                                    <span>Snap.animate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.animation\" class=\"dr-method\">\n                                    <span>Snap.animation()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.asin\" class=\"dr-method\">\n                                    <span>Snap.asin()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.atan\" class=\"dr-method\">\n                                    <span>Snap.atan()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.atan2\" class=\"dr-method\">\n                                    <span>Snap.atan2()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.closestPoint\" class=\"dr-method\">\n                                    <span>Snap.closestPoint()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.color\" class=\"dr-method\">\n                                    <span>Snap.color()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.cos\" class=\"dr-method\">\n                                    <span>Snap.cos()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.deg\" class=\"dr-method\">\n                                    <span>Snap.deg()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.deurl\" class=\"dr-method\">\n                                    <span>Snap.deurl()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.filter\" class=\"undefined\">\n                                    <span>Snap.filter</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.blur\" class=\"dr-method\">\n                                    <span>Snap.filter.blur()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.brightness\" class=\"dr-method\">\n                                    <span>Snap.filter.brightness()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.contrast\" class=\"dr-method\">\n                                    <span>Snap.filter.contrast()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.grayscale\" class=\"dr-method\">\n                                    <span>Snap.filter.grayscale()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.hueRotate\" class=\"dr-method\">\n                                    <span>Snap.filter.hueRotate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.invert\" class=\"dr-method\">\n                                    <span>Snap.filter.invert()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.saturate\" class=\"dr-method\">\n                                    <span>Snap.filter.saturate()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.sepia\" class=\"dr-method\">\n                                    <span>Snap.filter.sepia()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.filter.shadow\" class=\"dr-method\">\n                                    <span>Snap.filter.shadow()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.flat\" class=\"dr-property\">\n                                    <span>Snap.flat</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.format\" class=\"dr-method\">\n                                    <span>Snap.format()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.fragment\" class=\"dr-method\">\n                                    <span>Snap.fragment()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.getElementByPoint\" class=\"dr-method\">\n                                    <span>Snap.getElementByPoint()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.getRGB\" class=\"dr-method\">\n                                    <span>Snap.getRGB()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.hsb\" class=\"dr-method\">\n                                    <span>Snap.hsb()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.hsb2rgb\" class=\"dr-method\">\n                                    <span>Snap.hsb2rgb()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.hsl\" class=\"dr-method\">\n                                    <span>Snap.hsl()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.hsl2rgb\" class=\"dr-method\">\n                                    <span>Snap.hsl2rgb()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.importMUIColors\" class=\"dr-method\">\n                                    <span>Snap.importMUIColors()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.is\" class=\"dr-method\">\n                                    <span>Snap.is()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.len\" class=\"dr-method\">\n                                    <span>Snap.len()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.len2\" class=\"dr-method\">\n                                    <span>Snap.len2()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.load\" class=\"dr-method\">\n                                    <span>Snap.load()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.matrix\" class=\"dr-method\">\n                                    <span>Snap.matrix()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.mui\" class=\"dr-property\">\n                                    <span>Snap.mui</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.parse\" class=\"dr-method\">\n                                    <span>Snap.parse()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.parsePathString\" class=\"dr-method\">\n                                    <span>Snap.parsePathString()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.parseTransformString\" class=\"dr-method\">\n                                    <span>Snap.parseTransformString()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.path\" class=\"undefined\">\n                                    <span>Snap.path</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.bezierBBox\" class=\"dr-method\">\n                                    <span>Snap.path.bezierBBox()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.findDotsAtSegment\" class=\"dr-method\">\n                                    <span>Snap.path.findDotsAtSegment()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.getBBox\" class=\"dr-method\">\n                                    <span>Snap.path.getBBox()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.getPointAtLength\" class=\"dr-method\">\n                                    <span>Snap.path.getPointAtLength()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.getSubpath\" class=\"dr-method\">\n                                    <span>Snap.path.getSubpath()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.getTotalLength\" class=\"dr-method\">\n                                    <span>Snap.path.getTotalLength()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.intersection\" class=\"dr-method\">\n                                    <span>Snap.path.intersection()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.isBBoxIntersect\" class=\"dr-method\">\n                                    <span>Snap.path.isBBoxIntersect()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.isPointInside\" class=\"dr-method\">\n                                    <span>Snap.path.isPointInside()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.isPointInsideBBox\" class=\"dr-method\">\n                                    <span>Snap.path.isPointInsideBBox()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.map\" class=\"dr-method\">\n                                    <span>Snap.path.map()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.toAbsolute\" class=\"dr-method\">\n                                    <span>Snap.path.toAbsolute()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.toCubic\" class=\"dr-method\">\n                                    <span>Snap.path.toCubic()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl2\">\n                                <a href=\"#Snap.path.toRelative\" class=\"dr-method\">\n                                    <span>Snap.path.toRelative()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.plugin\" class=\"dr-method\">\n                                    <span>Snap.plugin()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.rad\" class=\"dr-method\">\n                                    <span>Snap.rad()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.rgb\" class=\"dr-method\">\n                                    <span>Snap.rgb()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.rgb2hsb\" class=\"dr-method\">\n                                    <span>Snap.rgb2hsb()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.rgb2hsl\" class=\"dr-method\">\n                                    <span>Snap.rgb2hsl()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.select\" class=\"dr-method\">\n                                    <span>Snap.select()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.selectAll\" class=\"dr-method\">\n                                    <span>Snap.selectAll()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.set\" class=\"dr-method\">\n                                    <span>Snap.set()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.sin\" class=\"dr-method\">\n                                    <span>Snap.sin()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.snapTo\" class=\"dr-method\">\n                                    <span>Snap.snapTo()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.tan\" class=\"dr-method\">\n                                    <span>Snap.tan()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#Snap.url\" class=\"dr-method\">\n                                    <span>Snap.url()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl0\">\n                                <a href=\"#mina\" class=\"dr-method\">\n                                    <span>mina()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.backin\" class=\"dr-method\">\n                                    <span>mina.backin()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.backout\" class=\"dr-method\">\n                                    <span>mina.backout()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.bounce\" class=\"dr-method\">\n                                    <span>mina.bounce()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.easein\" class=\"dr-method\">\n                                    <span>mina.easein()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.easeinout\" class=\"dr-method\">\n                                    <span>mina.easeinout()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.easeout\" class=\"dr-method\">\n                                    <span>mina.easeout()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.elastic\" class=\"dr-method\">\n                                    <span>mina.elastic()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.getById\" class=\"dr-method\">\n                                    <span>mina.getById()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.linear\" class=\"dr-method\">\n                                    <span>mina.linear()</span>\n                                </a>\n                            </li>\n                            <li class=\"dr-lvl1\">\n                                <a href=\"#mina.time\" class=\"dr-method\">\n                                    <span>mina.time()</span>\n                                </a>\n                            </li>\n                        </ol>\n                    </div>\n                </div>\n            </div>\n            <div id=\"site\">\n                <div id=\"content\" class=\"max-width\">\n                    <article id=\"Snap\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap(…)\n                                <a href=\"#Snap\" title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 33 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L33\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a drawing surface or wraps existing SVG element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">width of surface</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">height of surface</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">DOM</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-SVGElement\">SVGElement</em>\n                                            </span>\n                                            <span class=\"dr-description\">element to be wrapped into Snap structure</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">array</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">array of elements (will return set of\n                                                elements)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">query</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">CSS query selector</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.url\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.url(value)\n                                <a href=\"#Snap.url\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 106 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L106\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.url-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Wraps path into <code>&quot;url(&#39;&lt;path&gt;&#39;)&quot;</code>.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">wrapped path</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.format\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.format(token, json)\n                                <a href=\"#Snap.format\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 211 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L211\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.format-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Replaces construction of type <code>{&lt;name&gt;}</code>                                    to the corresponding argument\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">token</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">string to format</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">json</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">object which properties are used as a\n                                                replacement</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">formatted string</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">// this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\npaper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n    x: 10,\n    y: 20,\n    dim: {\n        width: 40,\n        height: 50,\n        \"negative width\": -40\n    }\n}));</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.rad\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.rad(deg)\n                                <a href=\"#Snap.rad\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 301 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L301\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.rad-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Transform angle to radians\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">deg</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle in degrees</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">angle in radians</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.deg\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.deg(rad)\n                                <a href=\"#Snap.deg\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 310 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L310\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.deg-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Transform angle to degrees\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">rad</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle in radians</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">angle in degrees</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.sin\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.sin(angle)\n                                <a href=\"#Snap.sin\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 319 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L319\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.sin-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.sin()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">angle</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle in degrees</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">sin</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.tan\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.tan(angle)\n                                <a href=\"#Snap.tan\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 330 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L330\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.tan-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.tan()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">angle</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle in degrees</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">tan</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.cos\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.cos(angle)\n                                <a href=\"#Snap.cos\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 341 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L341\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.cos-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.cos()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">angle</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle in degrees</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">cos</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.asin\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.asin(num)\n                                <a href=\"#Snap.asin\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 352 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L352\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.asin-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.asin()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">num</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">asin in degrees</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.acos\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.acos(num)\n                                <a href=\"#Snap.acos\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 363 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L363\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.acos-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.acos()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">num</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">acos in degrees</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.atan\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.atan(num)\n                                <a href=\"#Snap.atan\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 374 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L374\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.atan-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.atan()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">num</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">atan in degrees</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.atan2\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.atan2(num)\n                                <a href=\"#Snap.atan2\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 385 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L385\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.atan2-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent to <code>Math.atan2()</code> only works\n                                    with degrees, not radians.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">num</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">atan2 in degrees</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.angle\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.angle(x1, y1, x2, y2, [x3], [y3])\n                                <a href=\"#Snap.angle\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 401 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L401\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.angle-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an angle between two or three points\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of first point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of first point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of second point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of second point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x3</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of third point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y3</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of third point</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">angle in degrees</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.len\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.len(x1, y1, x2, y2)\n                                <a href=\"#Snap.len\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 413 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L413\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.len-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns distance between two points\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of first point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of first point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of second point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of second point</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">distance</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.len2\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.len2(x1, y1, x2, y2)\n                                <a href=\"#Snap.len2\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 427 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L427\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.len2-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns squared distance between two points\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of first point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of first point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of second point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of second point</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">distance</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.closestPoint\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.closestPoint(path, x, y)\n                                <a href=\"#Snap.closestPoint\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 446 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L446\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.closestPoint-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns closest point to a given one on a given path.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">path element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coord of a point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coord of a point</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">in format</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.is\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.is(o, type)\n                                <a href=\"#Snap.is\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 508 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L508\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.is-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Handy replacement for the <code>typeof</code> operator\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">o</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-…\">…</em>\n                                            </span>\n                                            <span class=\"dr-description\">any object or primitive</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">type</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">name of the type, e.g., <code>string</code>,\n                                                <code>function</code>, <code>number</code>,\n                                                etc.</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-boolean\">boolean</em>\n                                    <span class=\"dr-description\"><code>true</code> if given value is of given\n                                        type</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.snapTo\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.snapTo(values, value, [tolerance])\n                                <a href=\"#Snap.snapTo\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 519 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L519\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.snapTo-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Snaps given value to given grid\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">values</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-array\">array</em>\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">given array of values or step of the\n                                                grid</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value to adjust</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">tolerance</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">maximum distance to the target value\n                                                that would trigger the snap. Default\n                                                is <code>10</code>.</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">adjusted value</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.getRGB\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.getRGB(color)\n                                <a href=\"#Snap.getRGB\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 572 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L572\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.getRGB-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Parses color string as RGB object\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">color</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">color string in one of the following\n                                                formats:</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <ul>\n                                    <li>Color name (<code>red</code>, <code>green</code>,\n                                        <code>cornflowerblue</code>, etc)</li>\n                                    <li>#••• — shortened HTML color: (<code>#000</code>,\n                                        <code>#fc0</code>, etc.)</li>\n                                    <li>#•••••• — full length HTML color: (<code>#000000</code>,\n                                        <code>#bd2300</code>)</li>\n                                    <li>rgb(•••, •••, •••) — red, green and blue channels\n                                        values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n                                    <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n                                    <li>rgb(•••%, •••%, •••%) — same as above, but in\n                                        %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n                                    <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n                                    <li>hsb(•••, •••, •••) — hue, saturation and brightness\n                                        values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n                                    <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n                                    <li>hsb(•••%, •••%, •••%) — same as above, but in\n                                        %</li>\n                                    <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n                                    <li>hsl(•••, •••, •••) — hue, saturation and luminosity\n                                        values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n                                    <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n                                    <li>hsl(•••%, •••%, •••%) — same as above, but in\n                                        %</li>\n                                    <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n                                </ul>\n                                <p>Note that <code>%</code> can be used any time: <code>rgb(20%, 255, 50%)</code>.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">RGB object in the following format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">r</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">red,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">g</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">green,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">b</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">blue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">hex</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">color in HTML/CSS format: #••••••,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">error</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-boolean\">boolean</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">true if string can&#39;t be parsed</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.hsb\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.hsb(h, s, b)\n                                <a href=\"#Snap.hsb\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 660 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L660\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.hsb-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts HSB values to a hex representation of the\n                                    color\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">h</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">hue</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">s</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">saturation</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value or brightness</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">hex representation of the color</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.hsl\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.hsl(h, s, l)\n                                <a href=\"#Snap.hsl\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 673 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L673\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.hsl-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts HSL values to a hex representation of the\n                                    color\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">h</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">hue</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">s</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">saturation</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">l</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">luminosity</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">hex representation of the color</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.rgb\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.rgb(r, g, b)\n                                <a href=\"#Snap.rgb\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 686 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L686\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.rgb-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts RGB values to a hex representation of the\n                                    color\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">r</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">red</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">g</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">green</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">blue</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">hex representation of the color</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.color\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.color(clr)\n                                <a href=\"#Snap.color\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 772 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L772\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.color-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Parses the color string and returns an object featuring\n                                    the color&#39;s component values\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">clr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">color string in one of the supported\n                                                formats (see\n                                                <a href=\"#Snap.getRGB\"\n                                                class=\"dr-link\">Snap.getRGB</a>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Combined RGB/HSB object in the following format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">r</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">red,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">g</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">green,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">b</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">blue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">hex</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">color in HTML/CSS format: #••••••,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">error</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-boolean\">boolean</em>\n                                                </span>\n                                                <span class=\"dr-json-description\"><code>true</code> if string can&#39;t\n                                                    be parsed,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">h</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">hue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">s</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">saturation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">v</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">value (brightness),</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">l</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">lightness</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.hsb2rgb\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.hsb2rgb(h, s, v)\n                                <a href=\"#Snap.hsb2rgb\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 824 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L824\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.hsb2rgb-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts HSB values to an RGB object\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">h</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">hue</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">s</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">saturation</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">v</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">value or brightness</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">RGB object in the following format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">r</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">red,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">g</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">green,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">b</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">blue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">hex</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">color in HTML/CSS format: #••••••</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.hsl2rgb\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.hsl2rgb(h, s, l)\n                                <a href=\"#Snap.hsl2rgb\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 860 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L860\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.hsl2rgb-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts HSL values to an RGB object\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">h</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">hue</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">s</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">saturation</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">l</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">luminosity</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">RGB object in the following format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">r</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">red,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">g</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">green,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">b</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">blue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">hex</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">color in HTML/CSS format: #••••••</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.rgb2hsb\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.rgb2hsb(r, g, b)\n                                <a href=\"#Snap.rgb2hsb\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 899 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L899\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.rgb2hsb-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts RGB values to an HSB object\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">r</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">red</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">g</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">green</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">blue</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">HSB object in the following format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">h</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">hue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">s</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">saturation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">b</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">brightness</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.rgb2hsl\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.rgb2hsl(r, g, b)\n                                <a href=\"#Snap.rgb2hsl\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 931 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L931\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.rgb2hsl-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Converts RGB values to an HSL object\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">r</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">red</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">g</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">green</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">blue</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">HSL object in the following format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">h</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">hue,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">s</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">saturation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">l</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">luminosity</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.parsePathString\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.parsePathString(pathString)\n                                <a href=\"#Snap.parsePathString\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 964 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L964\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.parsePathString-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Parses given path string into an array\n                                    of arrays of path segments\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">pathString</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string or array of segments (in\n                                                the last case it is returned straight\n                                                away)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">array of segments</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.parseTransformString\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.parseTransformString(TString)\n                                <a href=\"#Snap.parseTransformString\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1017 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1017\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.parseTransformString-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Parses given transform string into\n                                    an array of transformations\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">TString</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">transform string or array of transformations\n                                                (in the last case it is returned\n                                                straight away)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">array of transformations</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.select\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.select(query)\n                                <a href=\"#Snap.select\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1277 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1277\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.select-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Wraps a DOM element specified by CSS selector as\n                                    <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">query</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">CSS selector of the element</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.selectAll\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.selectAll(query)\n                                <a href=\"#Snap.selectAll\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1289 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1289\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.selectAll-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Wraps DOM elements specified by CSS selector as set\n                                    or array of\n                                    <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">query</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">CSS selector of the element</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.node\">\n                        <header>\n                            <h2 class=\"dr-property\">Element.node()\n                                <a href=\"#Element.node\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1351 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1351\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.node-extra\"></div>\n                            <div class=\"dr-property\">\n                                <p>Gives you a reference to the DOM object, so you can\n                                    assign event handlers or just mess around.\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">// draw a circle at coordinate 10,10 with radius of 10\nvar c = paper.circle(10, 10, 10);\nc.node.onclick = function () {\n    c.attr(\"fill\", \"red\");\n};</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.type\">\n                        <header>\n                            <h2 class=\"dr-property\">Element.type()\n                                <a href=\"#Element.type\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1361 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1361\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.type-extra\"></div>\n                            <div class=\"dr-property\">\n                                <p>SVG tag name of the given element.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.attr\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.attr(…)\n                                <a href=\"#Element.attr\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1403 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1403\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.attr-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Gets or sets given attributes of the element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">params</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">contains key-value pairs of attributes\n                                                you want to set</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">param</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">name of the attribute</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                                <p>or\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">value of attribute</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">el.attr({\n    fill: \"#fc0\",\n    stroke: \"#000\",\n    strokeWidth: 2, // CamelCase...\n    \"fill-opacity\": 0.5, // or dash-separated names\n    width: \"*=2\" // prefixed values\n});\nconsole.log(el.attr(\"fill\")); // #fc0</code></pre></section>\n                                <p>Prefixed values in format <code>&quot;+=10&quot;</code>                                    supported. All four operations (\n                                    <code>+</code>, <code>-</code>, <code>*</code>                                    and <code>/</code>) could be used. Optionally\n                                    you can use units for <code>+</code> and <code>-</code>:\n                                    <code>&quot;+=2em&quot;</code>.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.parse\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.parse(svg)\n                                <a href=\"#Snap.parse\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1444 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1444\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.parse-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Parses SVG fragment and converts it into a\n                                    <a href=\"#Fragment\"\n                                    class=\"dr-link\">Fragment</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">svg</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">SVG string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Fragment\">Fragment</em>\n                                    <span class=\"dr-description\">the\n                                        <a href=\"#Fragment\" class=\"dr-link\">Fragment</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.fragment\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.fragment(varargs)\n                                <a href=\"#Snap.fragment\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1478 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1478\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.fragment-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a DOM fragment from a given list of elements\n                                    or strings\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">varargs</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-…\">…</em>\n                                            </span>\n                                            <span class=\"dr-description\">SVG string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Fragment\">Fragment</em>\n                                    <span class=\"dr-description\">the\n                                        <a href=\"#Fragment\" class=\"dr-link\">Fragment</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.el\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.el(name, attr)\n                                <a href=\"#Paper.el\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1581 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1581\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.el-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates an element on paper with a given name and\n                                    no attributes\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">name</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">tag name</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">attr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">attributes</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c = paper.circle(10, 10, 10); // is the same as...\nvar c = paper.el(\"circle\").attr({\n    cx: 10,\n    cy: 10,\n    r: 10\n});\n// and the same as\nvar c = paper.el(\"circle\", {\n    cx: 10,\n    cy: 10,\n    r: 10\n});</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.children\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.children()\n                                <a href=\"#Element.children\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1593 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1593\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.children-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns array of all the children of the element.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">array of Elements</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.toJSON\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.toJSON()\n                                <a href=\"#Element.toJSON\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1626 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1626\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.toJSON-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns object representation of the given element\n                                    and all its children.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">in format</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">type</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">this.type,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">attr</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-object\">object</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">attributes map,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">childNodes</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-array\">array</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">optional array of children in the\n                                                    same format</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.ajax\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.ajax(…)\n                                <a href=\"#Snap.ajax\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1744 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1744\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.ajax-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Simple implementation of Ajax\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">url</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">URL</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">postData</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">data for post request</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">scope</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">scope of callback</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">url</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">URL</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">scope</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">scope of callback</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-XMLHttpRequest\">XMLHttpRequest</em>\n                                    <span class=\"dr-description\">the XMLHttpRequest object, just in case</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.load\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.load(url, callback, [scope])\n                                <a href=\"#Snap.load\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1790 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1790\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.load-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Loads external SVG file as a\n                                    <a href=\"#Fragment\"\n                                    class=\"dr-link\">Fragment</a> (see\n                                    <a href=\"#Snap.ajax\" class=\"dr-link\">Snap.ajax</a> for more advanced AJAX)\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">url</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">URL</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">scope</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">scope of callback</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.getElementByPoint\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.getElementByPoint(x, y)\n                                <a href=\"#Snap.getElementByPoint\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1821 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1821\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.getElementByPoint-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns you topmost element under given point.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Snap element object</span>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate from the top left corner\n                                                of the window</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate from the top left corner\n                                                of the window</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.plugin\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.plugin(f)\n                                <a href=\"#Snap.plugin\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1856 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1856\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.plugin-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Let you write plugins. You pass in a function with\n                                    five arguments, like this:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">Snap.plugin(function (Snap, Element, Paper, global, Fragment) {\n    Snap.newmethod = function () {};\n    Element.prototype.newmethod = function () {};\n    Paper.prototype.newmethod = function () {};\n});</code></pre></section>\n                                <p>Inside the function you have access to all main objects\n                                    (and their prototypes). This allow you to extend\n                                    anything you want.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">f</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">your plugin body</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.getBBox\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.getBBox()\n                                <a href=\"#Element.getBBox\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 49 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L49\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.getBBox-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the bounding box descriptor for the given\n                                    element\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">bounding box descriptor:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">cx:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x of the center,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">cy:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x of the center,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">h:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">height,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">height:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">height,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">path:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">path command for the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">r0:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">radius of a circle that fully encloses\n                                                    the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">r1:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">radius of the smallest circle that\n                                                    can be enclosed,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">r2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">radius of the largest circle that\n                                                    can be enclosed,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">vb:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">box as a viewbox command,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">w:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">width,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">width:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">width,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">x2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x of the right side,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x of the left side,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y of the bottom edge,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y of the top edge</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.transform\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.transform(tstr)\n                                <a href=\"#Element.transform\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 144 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L144\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.transform-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Gets or sets transformation of the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">tstr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">transform string in Snap or SVG format</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                                <p>or\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">transformation descriptor:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">string</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">transform string,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">globalMatrix</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-Matrix\">Matrix</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">matrix of all transformations applied\n                                                    to element or its parents,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">localMatrix</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-Matrix\">Matrix</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">matrix of transformations applied\n                                                    only to the element,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">diffMatrix</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-Matrix\">Matrix</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">matrix of difference between global\n                                                    and local transformations,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">global</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">global transformation as string,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">local</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">local transformation as string,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">toString</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">returns <code>string</code> property</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.parent\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.parent()\n                                <a href=\"#Element.parent\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 202 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L202\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.parent-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the element&#39;s parent\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.append\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.append(el)\n                                <a href=\"#Element.append\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 214 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L214\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.append-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Appends the given element to current one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                                <em class=\"dr-type-Set\">Set</em>\n                                            </span>\n                                            <span class=\"dr-description\">element to append</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.add\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.add()\n                                <a href=\"#Element.add\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 220 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L220\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.add-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>See\n                                    <a href=\"#Element.append\" class=\"dr-link\">Element.append</a>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.appendTo\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.appendTo(el)\n                                <a href=\"#Element.appendTo\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 244 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L244\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.appendTo-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Appends the current element to the given one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">parent element to append to</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the child element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.prepend\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.prepend(el)\n                                <a href=\"#Element.prepend\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 260 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L260\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.prepend-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Prepends the given element to the current one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">element to prepend</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.prependTo\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.prependTo(el)\n                                <a href=\"#Element.prependTo\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 294 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L294\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.prependTo-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Prepends the current element to the given one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">parent element to prepend to</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the child element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.before\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.before(el)\n                                <a href=\"#Element.before\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 308 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L308\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.before-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Inserts given element before the current one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">element to insert</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.after\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.after(el)\n                                <a href=\"#Element.after\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 336 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L336\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.after-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Inserts given element after the current one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">element to insert</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.insertBefore\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.insertBefore(el)\n                                <a href=\"#Element.insertBefore\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 358 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L358\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.insertBefore-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Inserts the element after the given one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">element next to whom insert to</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.insertAfter\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.insertAfter(el)\n                                <a href=\"#Element.insertAfter\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 376 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L376\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.insertAfter-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Inserts the element after the given one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">el</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">element next to whom insert to</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the parent element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.remove\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.remove()\n                                <a href=\"#Element.remove\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 392 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L392\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.remove-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes element from the DOM\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the detached element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.select\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.select(query)\n                                <a href=\"#Element.select\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 409 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L409\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.select-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Gathers the nested\n                                    <a href=\"#Element\" class=\"dr-link\">Element</a> matching the given set of CSS selectors\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">query</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">CSS selector</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">result of query selection</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.selectAll\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.selectAll(query)\n                                <a href=\"#Element.selectAll\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 421 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L421\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.selectAll-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Gathers nested\n                                    <a href=\"#Element\" class=\"dr-link\">Element</a> objects matching the given set of\n                                    CSS selectors\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">query</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">CSS selector</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Set\">Set</em>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">result of query selection</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.asPX\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.asPX(attr, [value])\n                                <a href=\"#Element.asPX\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 439 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L439\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.asPX-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns given attribute of the element as a <code>px</code>                                    value (not %, em, etc.)\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">attribute name</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">attribute value</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">result of query selection</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.use\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.use()\n                                <a href=\"#Element.use\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 454 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L454\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.use-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a <code>&lt;use&gt;</code> element linked\n                                    to the current element\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the <code>&lt;use&gt;</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.clone\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.clone()\n                                <a href=\"#Element.clone\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 545 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L545\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.clone-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a clone of the element and inserts it after\n                                    the element\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the clone</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.toDefs\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.toDefs()\n                                <a href=\"#Element.toDefs\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 562 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L562\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.toDefs-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Moves element to the shared <code>&lt;defs&gt;</code>                                    area\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.toPattern\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.toPattern(x, y, width, height)\n                                <a href=\"#Element.toPattern\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 590 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L590\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.toPattern-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a <code>&lt;pattern&gt;</code> element from\n                                    the current element To create a pattern you have\n                                    to specify the pattern rect:\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the <code>&lt;pattern&gt;</code> element</span>\n                                </p>\n                                <p>You can use pattern later on as an argument for <code>fill</code>                                    attribute:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n        fill: \"none\",\n        stroke: \"#bada55\",\n        strokeWidth: 5\n    }).pattern(0, 0, 10, 10),\n    c = paper.circle(200, 200, 100);\nc.attr({\n    fill: p\n});</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.marker\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.marker(x, y, width, height, refX, refY)\n                                <a href=\"#Element.marker\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 631 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L631\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.marker-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a <code>&lt;marker&gt;</code> element from\n                                    the current element To create a marker you have\n                                    to specify the bounding rect and reference point:\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">refX</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">refY</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the <code>&lt;marker&gt;</code> element</span>\n                                </p>\n                                <p>You can specify the marker later as an argument for\n                                    <code>marker-start</code>, <code>marker-end</code>,\n                                    <code>marker-mid</code>, and <code>marker</code>                                    attributes. The <code>marker</code> attribute\n                                    places the marker at every point along the path,\n                                    and <code>marker-mid</code> places them at every\n                                    point except the start and end.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.data\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.data(key, [value])\n                                <a href=\"#Element.data\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 681 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L681\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.data-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds or retrieves given value associated with given\n                                    key. (Don’t confuse with <code>data-</code> attributes)\n                                </p>\n                                <p>See also\n                                    <a href=\"#Element.removeData\" class=\"dr-link\">Element.removeData</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">key</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">key to store data</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-any\">any</em>\n                                            </span>\n                                            <span class=\"dr-description\">value to store</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                                <p>or, if value is not specified:\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-any\">any</em>\n                                    <span class=\"dr-description\">value</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">for (var i = 0, i < 5, i++) {\n    paper.circle(10 + 15 * i, 10, 10)\n         .attr({fill: \"#000\"})\n         .data(\"i\", i)\n         .click(function () {\n            alert(this.data(\"i\"));\n         });\n}</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.removeData\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.removeData([key])\n                                <a href=\"#Element.removeData\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 710 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L710\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.removeData-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes value associated with an element by given\n                                    key. If key is not provided, removes all the\n                                    data of the element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">key</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">key</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.outerSVG\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.outerSVG()\n                                <a href=\"#Element.outerSVG\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 727 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L727\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.outerSVG-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns SVG code for the element, equivalent to HTML&#39;s\n                                    <code>outerHTML</code>.\n                                </p>\n                                <p>See also\n                                    <a href=\"#Element.innerSVG\" class=\"dr-link\">Element.innerSVG</a>\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">SVG code for the element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.toString\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.toString()\n                                <a href=\"#Element.toString\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 733 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L733\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.toString-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>See\n                                    <a href=\"#Element.outerSVG\" class=\"dr-link\">Element.outerSVG</a>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.innerSVG\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.innerSVG()\n                                <a href=\"#Element.innerSVG\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 741 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L741\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.innerSVG-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns SVG code for the element&#39;s contents,\n                                    equivalent to HTML&#39;s <code>innerHTML</code>\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">SVG code for the element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Fragment.select\">\n                        <header>\n                            <h2 class=\"dr-method\">Fragment.select()\n                                <a href=\"#Fragment.select\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 788 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L788\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Fragment.select-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>See\n                                    <a href=\"#Element.select\" class=\"dr-link\">Element.select</a>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Fragment.selectAll\">\n                        <header>\n                            <h2 class=\"dr-method\">Fragment.selectAll()\n                                <a href=\"#Fragment.selectAll\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 795 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L795\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Fragment.selectAll-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>See\n                                    <a href=\"#Element.selectAll\" class=\"dr-link\">Element.selectAll</a>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.deurl\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.deurl(value)\n                                <a href=\"#Snap.deurl\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 34 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L34\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.deurl-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Unwraps path from <code>&quot;url(&lt;path&gt;)&quot;</code>.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">url path</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">unwrapped path</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.animation\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.animation(attr, duration, [easing], [callback])\n                                <a\n                                href=\"#Snap.animation\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                    <a class=\"dr-sourceline\" title=\"Go to line 51 in the source\"\n                                    href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L51\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.animation-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates an animation object\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">attributes of final destination</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">duration</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">duration of the animation, in milliseconds</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">easing</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">one of easing functions of\n                                                <a href=\"#mina\"\n                                                class=\"dr-link\">mina</a> or custom one</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback function that fires when animation\n                                                ends</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">animation object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.inAnim\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.inAnim()\n                                <a href=\"#Element.inAnim\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 69 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L69\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.inAnim-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns a set of animations that may be able to manipulate\n                                    the current element\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">in format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">anim</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-object\">object</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation object,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">mina</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-object\">object</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">\n                                                    <a href=\"#mina\" class=\"dr-link\">mina</a> object,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">curStatus</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">0..1 — status of the animation: 0\n                                                    — just started, 1 — just finished,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">status</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">gets or sets the status of the animation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">stop</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">stops the animation</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.animate\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.animate(from, to, setter, duration, [easing], [callback])\n                                <a\n                                href=\"#Snap.animate\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                    <a class=\"dr-sourceline\" title=\"Go to line 119 in the source\"\n                                    href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L119\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.animate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Runs generic animation of one number into another\n                                    with a caring function\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">from</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">number or array of numbers</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">to</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">number or array of numbers</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">setter</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">caring function that accepts one number\n                                                argument</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">duration</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">duration, in milliseconds</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">easing</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">easing function from\n                                                <a href=\"#mina\"\n                                                class=\"dr-link\">mina</a> or custom</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback function to execute when animation\n                                                ends</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">animation object in\n                                        <a href=\"#mina\" class=\"dr-link\">mina</a> format</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">id</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation id, consider it read-only,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">duration</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">gets or sets the duration of the\n                                                    animation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">easing</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">easing,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">speed</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">gets or sets the speed of the animation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">status</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">gets or sets the status of the animation,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">stop</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">stops the animation</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var rect = Snap().rect(0, 0, 10, 10);\nSnap.animate(0, 10, function (val) {\n    rect.attr({\n        x: val\n    });\n}, 1000);\n// in given context is equivalent to\nrect.animate({x: 10}, 1000);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.stop\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.stop()\n                                <a href=\"#Element.stop\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 137 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L137\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.stop-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Stops all the animations for the current element\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.animate\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.animate(attrs, duration, [easing], [callback])\n                                <a\n                                href=\"#Element.animate\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                    <a class=\"dr-sourceline\" title=\"Go to line 156 in the source\"\n                                    href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L156\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.animate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Animates the given attributes of the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attrs</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">key-value pairs of destination attributes</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">duration</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">duration of the animation in milliseconds</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">easing</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">easing function from\n                                                <a href=\"#mina\"\n                                                class=\"dr-link\">mina</a> or custom</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback function that executes when\n                                                the animation ends</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.add\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.add(…)\n                                <a href=\"#Matrix.add\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 60 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L60\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.add-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds the given matrix to existing one\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">a</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">d</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">e</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">f</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">matrix</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#Matrix\" class=\"dr-link\">Matrix</a>\n                                            </span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.multLeft\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.multLeft(…)\n                                <a href=\"#Matrix.multLeft\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 89 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L89\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.multLeft-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Multiplies a passed affine transform to the left:\n                                    M * this.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">a</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">d</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">e</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">f</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">matrix</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#Matrix\" class=\"dr-link\">Matrix</a>\n                                            </span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.invert\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.invert()\n                                <a href=\"#Matrix.invert\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 112 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L112\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.invert-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an inverted version of the matrix\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Matrix\" class=\"dr-link\">Matrix</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.clone\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.clone()\n                                <a href=\"#Matrix.clone\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 124 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L124\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.clone-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns a copy of the matrix\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Matrix\" class=\"dr-link\">Matrix</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.translate\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.translate(x, y)\n                                <a href=\"#Matrix.translate\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 135 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L135\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.translate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Translate the matrix\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal offset distance</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical offset distance</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.scale\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.scale(x, [y], [cx], [cy])\n                                <a href=\"#Matrix.scale\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 151 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L151\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.scale-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Scales the matrix\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount to be scaled, with <code>1</code>                                                resulting in no change</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount to scale along the vertical axis.\n                                                (Otherwise <code>x</code> applies\n                                                to both axes.)</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">cx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal origin point from which to\n                                                scale</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">cy</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical origin point from which to scale</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>Default cx, cy is the middle point of the element.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.rotate\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.rotate(a, x, y)\n                                <a href=\"#Matrix.rotate\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 170 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L170\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.rotate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Rotates the matrix\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">a</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle of rotation, in degrees</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal origin point from which to\n                                                rotate</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical origin point from which to rotate</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.skewX\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.skewX(x)\n                                <a href=\"#Matrix.skewX\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 186 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L186\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.skewX-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Skews the matrix along the x-axis\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">Angle to skew along the x-axis (in degrees).</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.skewY\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.skewY(y)\n                                <a href=\"#Matrix.skewY\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 196 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L196\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.skewY-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Skews the matrix along the y-axis\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">Angle to skew along the y-axis (in degrees).</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.skew\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.skew(y, x)\n                                <a href=\"#Matrix.skew\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 207 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L207\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.skew-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Skews the matrix\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">Angle to skew along the y-axis (in degrees).</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">Angle to skew along the x-axis (in degrees).</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.x\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.x(x, y)\n                                <a href=\"#Matrix.x\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 225 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L225\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.x-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns x coordinate for given point after transformation\n                                    described by the matrix. See also\n                                    <a href=\"#Matrix.y\"\n                                    class=\"dr-link\">Matrix.y</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">x</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.y\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.y(x, y)\n                                <a href=\"#Matrix.y\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 237 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L237\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.y-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns y coordinate for given point after transformation\n                                    described by the matrix. See also\n                                    <a href=\"#Matrix.x\"\n                                    class=\"dr-link\">Matrix.x</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">y</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.determinant\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.determinant()\n                                <a href=\"#Matrix.determinant\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 264 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L264\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.determinant-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Finds determinant of the given matrix.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">determinant</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.split\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.split()\n                                <a href=\"#Matrix.split\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 281 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L281\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.split-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Splits matrix into primitive transformations\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">in format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>\n                                        <span class=\"dr-json-key\">dx</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">translation by x</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">dy</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">translation by y</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">scalex</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">scale by x</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">scaley</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">scale by y</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">shear</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">shear</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">rotate</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">rotation in deg</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">isSimple</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-boolean\">boolean</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">could it be represented via simple transformations</span>\n                                    </li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Matrix.toTransformString\">\n                        <header>\n                            <h2 class=\"dr-method\">Matrix.toTransformString()\n                                <a href=\"#Matrix.toTransformString\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 327 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L327\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Matrix.toTransformString-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns transform string that represents given matrix\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">transform string</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.Matrix\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.Matrix()\n                                <a href=\"#Snap.Matrix\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 348 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L348\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.Matrix-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Matrix constructor, extend on your own risk. To create\n                                    matrices use\n                                    <a href=\"#Snap.matrix\" class=\"dr-link\">Snap.matrix</a>.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.matrix\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.matrix(…)\n                                <a href=\"#Snap.matrix\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 366 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L366\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.matrix-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Returns a matrix based on the given\n                                    parameters\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">a</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">d</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">e</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">f</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">svgMatrix</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-SVGMatrix\">SVGMatrix</em>\n                                            </span>\n                                            <span class=\"dr-description\"></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Matrix\" class=\"dr-link\">Matrix</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.rect\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.rect(x, y, width, height, [rx], [ry])\n                                <a href=\"#Paper.rect\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 37 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L37\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.rect-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p></p>\n                                <p>Draws a rectangle\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate of the top left corner</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate of the top left corner</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">width</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">height</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">rx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal radius for rounded corners,\n                                                default is 0</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">ry</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical radius for rounded corners,\n                                                default is rx or 0</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>rect</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">// regular rectangle\nvar c = paper.rect(10, 10, 50, 50);\n// rectangle with rounded corners\nvar c = paper.rect(40, 40, 50, 50, 10);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.circle\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.circle(x, y, r)\n                                <a href=\"#Paper.circle\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 72 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L72\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.circle-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Draws a circle\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate of the centre</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate of the centre</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">r</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">radius</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>circle</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c = paper.circle(50, 50, 40);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.image\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.image(src, x, y, width, height)\n                                <a href=\"#Paper.image\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 123 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L123\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.image-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Places an image on the surface\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">src</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">URI of the source image</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x offset position</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y offset position</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">width of the image</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">height of the image</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>image</code> element</span>\n                                </p>\n                                <p>or\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Snap element object with type <code>image</code></span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c = paper.image(\"apple.png\", 10, 10, 80, 80);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.ellipse\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.ellipse(x, y, rx, ry)\n                                <a href=\"#Paper.ellipse\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 166 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L166\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.ellipse-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Draws an ellipse\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate of the centre</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate of the centre</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">rx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal radius</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">ry</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical radius</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>ellipse</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c = paper.ellipse(50, 50, 40, 20);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.path\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.path([pathString])\n                                <a href=\"#Paper.path\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 211 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L211\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.path-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a <code>&lt;path&gt;</code> element using\n                                    the given string as the path&#39;s definition\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">pathString</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string in SVG format</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>Path string consists of one-letter commands, followed\n                                    by comma seprarated arguments in numerical form.\n                                    Example:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">\"M10,20L30,40\"</code></pre></section>\n                                <p>This example features two commands: <code>M</code>,\n                                    with arguments <code>(10, 20)</code> and <code>L</code>                                    with arguments <code>(30, 40)</code>. Uppercase\n                                    letter commands express coordinates in absolute\n                                    terms, while lowercase commands express them\n                                    in relative terms from the most recently declared\n                                    coordinates.\n                                </p>\n                                <p></p>\n                                <p>Here is short list of commands available, for more\n                                    details see\n                                    <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\"\n                                    title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or\n                                    <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n                                <table>\n                                    <thead>\n                                        <tr>\n                                            <th>Command</th>\n                                            <th>Name</th>\n                                            <th>Parameters</th>\n                                        </tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr>\n                                            <td>M</td>\n                                            <td>moveto</td>\n                                            <td>(x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>Z</td>\n                                            <td>closepath</td>\n                                            <td>(none)</td>\n                                        </tr>\n                                        <tr>\n                                            <td>L</td>\n                                            <td>lineto</td>\n                                            <td>(x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>H</td>\n                                            <td>horizontal lineto</td>\n                                            <td>x+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>V</td>\n                                            <td>vertical lineto</td>\n                                            <td>y+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>C</td>\n                                            <td>curveto</td>\n                                            <td>(x1 y1 x2 y2 x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>S</td>\n                                            <td>smooth curveto</td>\n                                            <td>(x2 y2 x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>Q</td>\n                                            <td>quadratic Bézier curveto</td>\n                                            <td>(x1 y1 x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>T</td>\n                                            <td>smooth quadratic Bézier curveto</td>\n                                            <td>(x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>A</td>\n                                            <td>elliptical arc</td>\n                                            <td>(rx ry x-axis-rotation large-arc-flag\n                                                sweep-flag x y)+</td>\n                                        </tr>\n                                        <tr>\n                                            <td>R</td>\n                                            <td>\n                                                <a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td>\n                                            <td>x1 y1 (x y)+</td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                                <p>\n                                    <li>\n                                        <em>Catmull-Rom curveto</em> is a not standard\n                                        SVG command and added to make life easier.</li>\n                                    Note: there is a special case when a path consists of only three commands: <code>M10,10R…z</code>.\n                                    In this case the path connects back to its starting\n                                    point.\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c = paper.path(\"M10 10L90 90\");\n// draw a diagonal line:\n// move to 10,10, line to 90,90</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.g\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.g([varargs])\n                                <a href=\"#Paper.g\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 239 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L239\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.g-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a group element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">varargs</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-…\">…</em>\n                                            </span>\n                                            <span class=\"dr-description\">elements to nest within the group</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>g</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c1 = paper.circle(),\n    c2 = paper.rect(),\n    g = paper.g(c2, c1); // note that the order of elements is different</code></pre></section>\n                                <p>or\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var c1 = paper.circle(),\n    c2 = paper.rect(),\n    g = paper.g();\ng.add(c2, c1);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.group\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.group()\n                                <a href=\"#Paper.group\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 245 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L245\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.group-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>See\n                                    <a href=\"#Paper.g\" class=\"dr-link\">Paper.g</a>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.svg\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.svg(x, y, width, height, vbx, vby, vbw, vbh)\n                                <a\n                                href=\"#Paper.svg\" title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                    <a class=\"dr-sourceline\" title=\"Go to line 272 in the source\"\n                                    href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L272\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.svg-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a nested SVG element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> X of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> Y of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> width of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> height of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox X</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vby</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox Y</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbw</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox width</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbh</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox height</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>svg</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.mask\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.mask()\n                                <a href=\"#Paper.mask\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 304 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L304\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.mask-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent in behaviour to\n                                    <a href=\"#Paper.g\" class=\"dr-link\">Paper.g</a>, except it’s a mask.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>mask</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.ptrn\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.ptrn(x, y, width, height, vbx, vby, vbw, vbh)\n                                <a\n                                href=\"#Paper.ptrn\" title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                    <a class=\"dr-sourceline\" title=\"Go to line 331 in the source\"\n                                    href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L331\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.ptrn-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent in behaviour to\n                                    <a href=\"#Paper.g\" class=\"dr-link\">Paper.g</a>, except it’s a pattern.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> X of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> Y of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">width</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> width of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">height</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> height of the element</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox X</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vby</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox Y</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbw</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox width</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbh</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox height</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>pattern</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.use\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.use(…)\n                                <a href=\"#Paper.use\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 368 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L368\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.use-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a &lt;use&gt; element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">id</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> id of element to link</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">id</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> element to link</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>use</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.symbol\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.symbol(vbx, vby, vbw, vbh)\n                                <a href=\"#Paper.symbol\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 396 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L396\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.symbol-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a &lt;symbol&gt; element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">vbx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox X</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vby</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox Y</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbw</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox width</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">vbh</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">\n                                                <a href=\"#optional\" class=\"dr-link\">optional</a> viewbox height</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>symbol</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.text\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.text(x, y, text)\n                                <a href=\"#Paper.text\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 424 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L424\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.text-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Draws a text string\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate position</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate position</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">text</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">The text string to draw or array of strings\n                                                to nest within separate <code>&lt;tspan&gt;</code>                                                elements</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>text</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var t1 = paper.text(50, 50, \"Snap\");\nvar t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n// Text path usage\nt1.attr({textpath: \"M10,10L100,100\"});\n// or\nvar pth = paper.path(\"M10,10L100,100\");\nt1.attr({textpath: pth});</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.line\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.line(x1, y1, x2, y2)\n                                <a href=\"#Paper.line\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 452 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L452\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.line-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Draws a line\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate position of the start</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate position of the start</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate position of the end</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate position of the end</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>line</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var t1 = paper.line(50, 50, 100, 100);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.polyline\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.polyline(…)\n                                <a href=\"#Paper.polyline\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 481 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L481\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.polyline-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Draws a polyline\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">points</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">array of points</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">varargs</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-…\">…</em>\n                                            </span>\n                                            <span class=\"dr-description\">points</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>polyline</code> element</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var p1 = paper.polyline([10, 10, 100, 100]);\nvar p2 = paper.polyline(10, 10, 100, 100);</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.polygon\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.polygon()\n                                <a href=\"#Paper.polygon\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 499 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L499\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.polygon-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Draws a polygon. See\n                                    <a href=\"#Paper.polyline\" class=\"dr-link\">Paper.polyline</a>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.stops\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.stops()\n                                <a href=\"#Element.stops\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 523 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L523\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.stops-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Only for gradients! Returns array of gradient stops\n                                    elements.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">the stops array.</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.addStop\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.addStop(color, offset)\n                                <a href=\"#Element.addStop\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 536 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L536\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.addStop-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Only for gradients! Adds another stop to the gradient.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">color</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">stops color</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">offset</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">stops offset 0..100</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">gradient element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.setStops\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.setStops(str)\n                                <a href=\"#Element.setStops\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 587 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L587\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.setStops-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Only for gradients! Updates stops of the gradient\n                                    based on passed gradient descriptor. See\n                                    <a href=\"#Paper.gradient\"\n                                    class=\"dr-link\">Paper.gradient</a>\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">str</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">gradient descriptor part after <code>()</code>.</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">gradient element</span>\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\ng.setStops(\"#fff-#000-#f00-#fc0\");</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.gradient\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.gradient(gradient)\n                                <a href=\"#Paper.gradient\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 712 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L712\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.gradient-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a gradient element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">gradient</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">gradient descriptor</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <h3>Gradient Descriptor</h3>\n                                <p>The gradient descriptor is an expression formatted\n                                    as follows: <code>&lt;type&gt;(&lt;coords&gt;)&lt;colors&gt;</code>.\n                                    The <code>&lt;type&gt;</code> can be either linear\n                                    or radial. The uppercase <code>L</code> or <code>R</code>                                    letters indicate absolute coordinates offset\n                                    from the SVG surface. Lowercase <code>l</code>                                    or <code>r</code> letters indicate coordinates\n                                    calculated relative to the element to which the\n                                    gradient is applied. Coordinates specify a linear\n                                    gradient vector as\n                                    <code>x1</code>, <code>y1</code>, <code>x2</code>,\n                                    <code>y2</code>, or a radial gradient as <code>cx</code>,\n                                    <code>cy</code>,\n                                    <code>r</code> and optional <code>fx</code>,\n                                    <code>fy</code> specifying a focal point away\n                                    from the center of the circle. Specify <code>&lt;colors&gt;</code>                                    as a list of dash-separated CSS color values.\n                                    Each color may be followed by a custom offset\n                                    value, separated with a colon character.\n                                </p>\n                                <h3>Examples</h3>\n                                <p>Linear gradient, relative from top-left corner to\n                                    bottom-right corner, from black through red to\n                                    white:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");</code></pre></section>\n                                <p>Linear gradient, absolute from (0, 0) to (100, 100),\n                                    from black through red at 25% to white:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25-#fff\");</code></pre></section>\n                                <p>Radial gradient, relative from the center of the\n                                    element with radius half the width, from black\n                                    to white:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");</code></pre></section>\n                                <p>To apply the gradient:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">paper.circle(50, 50, 40).attr({\n    fill: g\n});</code></pre></section>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">the <code>gradient</code> element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.toString\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.toString()\n                                <a href=\"#Paper.toString\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 728 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L728\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.toString-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns SVG code for the\n                                    <a href=\"#Paper\" class=\"dr-link\">Paper</a>\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">SVG code for the\n                                        <a href=\"#Paper\" class=\"dr-link\">Paper</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.toDataURL\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.toDataURL()\n                                <a href=\"#Paper.toDataURL\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 748 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L748\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.toDataURL-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns SVG code for the\n                                    <a href=\"#Paper\" class=\"dr-link\">Paper</a> as Data URI string.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">Data URI string</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.clear\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.clear()\n                                <a href=\"#Paper.clear\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 759 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L759\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.clear-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes all child nodes of the paper, except &lt;defs&gt;.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.addClass\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.addClass(value)\n                                <a href=\"#Element.addClass\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 29 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L29\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.addClass-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds given class name or list of class names to the\n                                    element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">class name or space separated list of\n                                                class names</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">original element.</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.removeClass\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.removeClass(value)\n                                <a href=\"#Element.removeClass\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 64 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L64\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.removeClass-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes given class name or list of class names from\n                                    the element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">class name or space separated list of\n                                                class names</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">original element.</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.hasClass\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.hasClass(value)\n                                <a href=\"#Element.hasClass\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 98 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L98\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.hasClass-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Checks if the element has a given class name in the\n                                    list of class names applied to it.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">class name</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-boolean\">boolean</em>\n                                    <span class=\"dr-description\"><code>true</code> if the element has given class</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.toggleClass\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.toggleClass(value, flag)\n                                <a href=\"#Element.toggleClass\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 115 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L115\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.toggleClass-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Add or remove one or more classes from the element,\n                                    depending on either the class’s presence or the\n                                    value of the <code>flag</code> argument.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">value</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">class name or space separated list of\n                                                class names</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">flag</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-boolean\">boolean</em>\n                                            </span>\n                                            <span class=\"dr-description\">value to determine whether the class\n                                                should be added or removed</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">original element.</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina\">\n                        <header>\n                            <h2 class=\"dr-method\">mina(a, A, b, B, get, set, [easing])\n                                <a href=\"#mina\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 180 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L180\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Generic animation of numbers\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">a</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">start\n                                                <em>slave</em> number</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">A</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">end\n                                                <em>slave</em> number</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">b</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">start\n                                                <em>master</em> number (start time in\n                                                general case)</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">B</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">end\n                                                <em>master</em> number (end time in general\n                                                case)</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">get</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">getter of\n                                                <em>master</em> number (see\n                                                <a href=\"#mina.time\"\n                                                class=\"dr-link\">mina.time</a>)</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">set</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">setter of\n                                                <em>slave</em> number</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">easing</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">easing function, default is\n                                                <a href=\"#mina.linear\"\n                                                class=\"dr-link\">mina.linear</a>\n                                            </span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">animation descriptor</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">id</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-string\">string</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation id,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">start</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">start\n                                                    <em>slave</em> number,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">end</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">end\n                                                    <em>slave</em> number,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">b</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">start\n                                                    <em>master</em> number,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">s</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation status (0..1),</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">dur</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation duration,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">spd</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation speed,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">get</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">getter of\n                                                    <em>master</em> number (see\n                                                    <a href=\"#mina.time\"\n                                                    class=\"dr-link\">mina.time</a>),</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">set</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">setter of\n                                                    <em>slave</em> number,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">easing</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">easing function, default is\n                                                    <a href=\"#mina.linear\"\n                                                    class=\"dr-link\">mina.linear</a>,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">status</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">status getter/setter,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">speed</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">speed getter/setter,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">duration</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">duration getter/setter,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">stop</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">animation stopper</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">pause</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">pauses the animation</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">resume</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">resumes the animation</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">update</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-function\">function</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">calles setter with the right value\n                                                    of the animation</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.time\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.time()\n                                <a href=\"#mina.time\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 220 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L220\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.time-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the current time. Equivalent to:\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">function () {\n    return (new Date).getTime();\n}</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.getById\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.getById(id)\n                                <a href=\"#mina.getById\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 229 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L229\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.getById-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an animation by its id\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">id</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">animation&#39;s id</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">See\n                                        <a href=\"#mina\" class=\"dr-link\">mina</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.linear\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.linear(n)\n                                <a href=\"#mina.linear\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 241 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L241\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.linear-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Default linear easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.easeout\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.easeout(n)\n                                <a href=\"#mina.easeout\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 252 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L252\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.easeout-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Easeout easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.easein\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.easein(n)\n                                <a href=\"#mina.easein\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 263 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L263\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.easein-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Easein easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.easeinout\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.easeinout(n)\n                                <a href=\"#mina.easeinout\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 274 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L274\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.easeinout-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Easeinout easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.backin\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.backin(n)\n                                <a href=\"#mina.backin\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 298 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L298\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.backin-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Backin easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.backout\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.backout(n)\n                                <a href=\"#mina.backout\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 313 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L313\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.backout-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Backout easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.elastic\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.elastic(n)\n                                <a href=\"#mina.elastic\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 329 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L329\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.elastic-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Elastic easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"mina.bounce\">\n                        <header>\n                            <h2 class=\"dr-method\">mina.bounce(n)\n                                <a href=\"#mina.bounce\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 344 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L344\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"mina.bounce-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Bounce easing\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">n</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">input 0..1</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">output 0..1</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Paper.filter\">\n                        <header>\n                            <h2 class=\"dr-method\">Paper.filter(filstr)\n                                <a href=\"#Paper.filter\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 36 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L36\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Paper.filter-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a <code>&lt;filter&gt;</code> element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">filstr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">SVG fragment of filter provided as a\n                                                string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                                <p>Note: It is recommended to use filters embedded into\n                                    the page inside an empty SVG element.\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n    c = paper.circle(10, 10, 10).attr({\n        filter: f\n    });</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.blur\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.blur(x, [y])\n                                <a href=\"#Snap.filter.blur\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 95 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L95\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.blur-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the blur filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of horizontal blur, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of vertical blur, in pixels</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var f = paper.filter(Snap.filter.blur(5, 10)),\n    c = paper.circle(10, 10, 10).attr({\n        filter: f\n    });</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.shadow\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.shadow(…)\n                                <a href=\"#Snap.filter.shadow\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 134 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L134\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.shadow-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the shadow filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">dx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal shift of the shadow, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">dy</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical shift of the shadow, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">blur</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of blur</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">color</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">color of the shadow</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">opacity</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"><code>0..1</code> opacity of the shadow</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">dx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal shift of the shadow, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">dy</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical shift of the shadow, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">color</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">color of the shadow</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">opacity</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"><code>0..1</code> opacity of the shadow</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>which makes blur default to <code>4</code>. Or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">dx</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">horizontal shift of the shadow, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">dy</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">vertical shift of the shadow, in pixels</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">opacity</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\"><code>0..1</code> opacity of the shadow</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var f = paper.filter(Snap.filter.shadow(0, 2, .3)),\n    c = paper.circle(10, 10, 10).attr({\n        filter: f\n    });</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.grayscale\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.grayscale(amount)\n                                <a href=\"#Snap.filter.grayscale\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 180 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L180\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.grayscale-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the grayscale filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">amount</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of filter (<code>0..1</code>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.sepia\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.sepia(amount)\n                                <a href=\"#Snap.filter.sepia\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 207 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L207\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.sepia-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the sepia filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">amount</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of filter (<code>0..1</code>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.saturate\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.saturate(amount)\n                                <a href=\"#Snap.filter.saturate\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 235 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L235\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.saturate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the saturate filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">amount</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of filter (<code>0..1</code>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.hueRotate\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.hueRotate(angle)\n                                <a href=\"#Snap.filter.hueRotate\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 255 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L255\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.hueRotate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the hue-rotate filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">angle</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">angle of rotation</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.invert\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.invert(amount)\n                                <a href=\"#Snap.filter.invert\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 273 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L273\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.invert-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the invert filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">amount</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of filter (<code>0..1</code>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.brightness\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.brightness(amount)\n                                <a href=\"#Snap.filter.brightness\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 295 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L295\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.brightness-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the brightness filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">amount</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of filter (<code>0..1</code>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.filter.contrast\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.filter.contrast(amount)\n                                <a href=\"#Snap.filter.contrast\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 315 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L315\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.filter.contrast-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns an SVG markup string for the contrast filter\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">amount</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">amount of filter (<code>0..1</code>)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">filter representation</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.click\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.click(handler)\n                                <a href=\"#Element.click\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 143 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L143\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.click-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a click event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unclick\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unclick(handler)\n                                <a href=\"#Element.unclick\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 151 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L151\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unclick-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a click event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.dblclick\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.dblclick(handler)\n                                <a href=\"#Element.dblclick\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 160 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L160\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.dblclick-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a double click event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.undblclick\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.undblclick(handler)\n                                <a href=\"#Element.undblclick\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 168 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L168\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.undblclick-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a double click event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.mousedown\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.mousedown(handler)\n                                <a href=\"#Element.mousedown\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 177 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L177\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.mousedown-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a mousedown event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unmousedown\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unmousedown(handler)\n                                <a href=\"#Element.unmousedown\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 185 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L185\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unmousedown-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a mousedown event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.mousemove\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.mousemove(handler)\n                                <a href=\"#Element.mousemove\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 194 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L194\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.mousemove-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a mousemove event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unmousemove\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unmousemove(handler)\n                                <a href=\"#Element.unmousemove\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 202 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L202\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unmousemove-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a mousemove event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.mouseout\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.mouseout(handler)\n                                <a href=\"#Element.mouseout\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 211 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L211\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.mouseout-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a mouseout event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unmouseout\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unmouseout(handler)\n                                <a href=\"#Element.unmouseout\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 219 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L219\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unmouseout-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a mouseout event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.mouseover\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.mouseover(handler)\n                                <a href=\"#Element.mouseover\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 228 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L228\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.mouseover-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a mouseover event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unmouseover\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unmouseover(handler)\n                                <a href=\"#Element.unmouseover\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 236 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L236\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unmouseover-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a mouseover event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.mouseup\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.mouseup(handler)\n                                <a href=\"#Element.mouseup\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 245 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L245\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.mouseup-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a mouseup event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unmouseup\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unmouseup(handler)\n                                <a href=\"#Element.unmouseup\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 253 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L253\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unmouseup-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a mouseup event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.touchstart\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.touchstart(handler)\n                                <a href=\"#Element.touchstart\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 262 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L262\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.touchstart-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a touchstart event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.untouchstart\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.untouchstart(handler)\n                                <a href=\"#Element.untouchstart\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 270 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L270\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.untouchstart-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a touchstart event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.touchmove\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.touchmove(handler)\n                                <a href=\"#Element.touchmove\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 279 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L279\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.touchmove-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a touchmove event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.untouchmove\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.untouchmove(handler)\n                                <a href=\"#Element.untouchmove\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 287 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L287\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.untouchmove-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a touchmove event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.touchend\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.touchend(handler)\n                                <a href=\"#Element.touchend\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 296 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L296\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.touchend-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a touchend event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.untouchend\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.untouchend(handler)\n                                <a href=\"#Element.untouchend\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 304 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L304\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.untouchend-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a touchend event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.touchcancel\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.touchcancel(handler)\n                                <a href=\"#Element.touchcancel\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 313 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L313\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.touchcancel-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds a touchcancel event handler to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.untouchcancel\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.untouchcancel(handler)\n                                <a href=\"#Element.untouchcancel\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 321 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L321\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.untouchcancel-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes a touchcancel event handler from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">handler</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for the event</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.hover\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.hover(f_in, f_out, [icontext], [ocontext])\n                                <a\n                                href=\"#Element.hover\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                    <a class=\"dr-sourceline\" title=\"Go to line 366 in the source\"\n                                    href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L366\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.hover-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds hover event handlers to the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">f_in</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for hover in</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">f_out</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for hover out</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">icontext</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">context for hover in handler</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">ocontext</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">context for hover out handler</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.unhover\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.unhover(f_in, f_out)\n                                <a href=\"#Element.unhover\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 378 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L378\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.unhover-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes hover event handlers from the element\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">f_in</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for hover in</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">f_out</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for hover out</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.drag\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.drag(onmove, onstart, onend, [mcontext], [scontext],\n                                [econtext])\n                                <a href=\"#Element.drag\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 416 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L416\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.drag-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds event handlers for an element&#39;s drag gesture\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">onmove</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for moving</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">onstart</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for drag start</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">onend</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">handler for drag end</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">mcontext</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">context for moving handler</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">scontext</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">context for drag start handler</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">econtext</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">context for drag end handler</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>Additionaly following <code>drag</code> events are\n                                    triggered: <code>drag.start.&lt;id&gt;</code>                                    on start,\n                                    <code>drag.end.&lt;id&gt;</code> on end and <code>drag.move.&lt;id&gt;</code>                                    on every move. When element is dragged over another\n                                    element\n                                    <code>drag.over.&lt;id&gt;</code> fires as well.\n                                </p>\n                                <p>Start event and start handler are called in specified\n                                    context or in context of the element with following\n                                    parameters:\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>\n                                        <span class=\"dr-json-key\">x</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">x position of the mouse</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">y</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">y position of the mouse</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">event</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-object\">object</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">DOM event object</span>\n                                    </li>\n                                </ol>\n                                <p>Move event and move handler are called in specified\n                                    context or in context of the element with following\n                                    parameters:\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>\n                                        <span class=\"dr-json-key\">dx</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">shift by x from the start point</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">dy</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">shift by y from the start point</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">x</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">x position of the mouse</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">y</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-number\">number</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">y position of the mouse</span>\n                                    </li>\n                                    <li>\n                                        <span class=\"dr-json-key\">event</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-object\">object</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">DOM event object</span>\n                                    </li>\n                                </ol>\n                                <p>End event and end handler are called in specified\n                                    context or in context of the element with following\n                                    parameters:\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>\n                                        <span class=\"dr-json-key\">event</span>\n                                        <span class=\"dr-type\">\n                                            <em class=\"dr-type-object\">object</em>\n                                        </span>\n                                        <span class=\"dr-json-description\">DOM event object</span>\n                                    </li>\n                                </ol>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">\n                                        <a href=\"#Element\" class=\"dr-link\">Element</a>\n                                    </span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.undrag\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.undrag()\n                                <a href=\"#Element.undrag\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 465 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L465\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.undrag-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes all drag event handlers from the given element\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.getTotalLength\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.getTotalLength(path)\n                                <a href=\"#Snap.path.getTotalLength\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1130 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1130\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.getTotalLength-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the length of the given path in pixels\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">SVG path string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">length</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.getPointAtLength\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.getPointAtLength(path, length)\n                                <a href=\"#Snap.path.getPointAtLength\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1147 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1147\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.getPointAtLength-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the coordinates of the point located at the\n                                    given length along the given path\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">SVG path string</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">length</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">length, in pixels, from the start of\n                                                the path, excluding non-rendering\n                                                jumps</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">representation of the point:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">alpha:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">angle of derivative</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.getSubpath\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.getSubpath(path, from, to)\n                                <a href=\"#Snap.path.getSubpath\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1160 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1160\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.getSubpath-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the subpath of a given path between given\n                                    start and end lengths\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">SVG path string</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">from</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">length, in pixels, from the start of\n                                                the path to the start of the segment</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">to</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">length, in pixels, from the start of\n                                                the path to the end of the segment</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">path string definition for the segment</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.getTotalLength\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.getTotalLength()\n                                <a href=\"#Element.getTotalLength\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1174 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1174\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.getTotalLength-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns the length of the path in pixels (only works\n                                    for <code>path</code> elements)\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-number\">number</em>\n                                    <span class=\"dr-description\">length</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.getPointAtLength\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.getPointAtLength(length)\n                                <a href=\"#Element.getPointAtLength\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1195 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1195\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.getPointAtLength-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns coordinates of the point located at the given\n                                    length on the given path (only works for <code>path</code>                                    elements)\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">length</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">length, in pixels, from the start of\n                                                the path, excluding non-rendering\n                                                jumps</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">representation of the point:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">alpha:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">angle of derivative</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Element.getSubpath\">\n                        <header>\n                            <h2 class=\"dr-method\">Element.getSubpath(from, to)\n                                <a href=\"#Element.getSubpath\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1210 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1210\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Element.getSubpath-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Returns subpath of a given element from given start\n                                    and end lengths (only works for <code>path</code>                                    elements)\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">from</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">length, in pixels, from the start of\n                                                the path to the start of the segment</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">to</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">length, in pixels, from the start of\n                                                the path to the end of the segment</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">path string definition for the segment</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.findDotsAtSegment\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x,\n                                c2y, p2x, p2y, t)\n                                <a href=\"#Snap.path.findDotsAtSegment\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1253 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1253\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.findDotsAtSegment-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Finds dot coordinates on the given\n                                    cubic beziér curve at the given t\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">p1x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the first point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">p1y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the first point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c1x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the first anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c1y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the first anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c2x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the second anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c2y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the second anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">p2x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the second point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">p2y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the second point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">t</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">position on the curve (0..1)</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">point information in format:</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate of the point,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate of the point,</span>\n                                            </li>\n                                            <li> m: {\n                                                <ol class=\"dr-json\">\n                                                    <li>\n                                                        <span class=\"dr-json-key\">x:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">x coordinate of the left\n                                                            anchor,</span>\n                                                    </li>\n                                                    <li>\n                                                        <span class=\"dr-json-key\">y:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">y coordinate of the left\n                                                            anchor</span>\n                                                    </li>\n                                                </ol>\n                                            </li>\n                                            <li> },</li>\n                                            <li> n: {\n                                                <ol class=\"dr-json\">\n                                                    <li>\n                                                        <span class=\"dr-json-key\">x:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">x coordinate of the right\n                                                            anchor,</span>\n                                                    </li>\n                                                    <li>\n                                                        <span class=\"dr-json-key\">y:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">y coordinate of the right\n                                                            anchor</span>\n                                                    </li>\n                                                </ol>\n                                            </li>\n                                            <li> },</li>\n                                            <li> start: {\n                                                <ol class=\"dr-json\">\n                                                    <li>\n                                                        <span class=\"dr-json-key\">x:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">x coordinate of the start\n                                                            of the curve,</span>\n                                                    </li>\n                                                    <li>\n                                                        <span class=\"dr-json-key\">y:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">y coordinate of the start\n                                                            of the curve</span>\n                                                    </li>\n                                                </ol>\n                                            </li>\n                                            <li> },</li>\n                                            <li> end: {\n                                                <ol class=\"dr-json\">\n                                                    <li>\n                                                        <span class=\"dr-json-key\">x:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">x coordinate of the end of\n                                                            the curve,</span>\n                                                    </li>\n                                                    <li>\n                                                        <span class=\"dr-json-key\">y:</span>\n                                                        <span class=\"dr-type\">\n                                                            <em class=\"dr-type-number\">number</em>\n                                                        </span>\n                                                        <span class=\"dr-json-description\">y coordinate of the end of\n                                                            the curve</span>\n                                                    </li>\n                                                </ol>\n                                            </li>\n                                            <li> },</li>\n                                            <li>\n                                                <span class=\"dr-json-key\">alpha:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">angle of the curve derivative at\n                                                    the point</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.bezierBBox\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.bezierBBox(…)\n                                <a href=\"#Snap.path.bezierBBox\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1281 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1281\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.bezierBBox-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Returns the bounding box of a given\n                                    cubic beziér curve\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">p1x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the first point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">p1y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the first point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c1x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the first anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c1y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the first anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c2x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the second anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">c2y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the second anchor of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">p2x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the second point of the curve</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">p2y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the second point of the curve</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">bez</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">array of six points for beziér curve</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">bounding box</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate of the left top point\n                                                    of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate of the left top point\n                                                    of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">x2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate of the right bottom\n                                                    point of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate of the right bottom\n                                                    point of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">width:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">width of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">height:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">height of the box</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.isPointInsideBBox\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.isPointInsideBBox(bbox, x, y)\n                                <a href=\"#Snap.path.isPointInsideBBox\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1294 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1294\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.isPointInsideBBox-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Returns <code>true</code> if given\n                                    point is inside bounding box\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">bbox</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">bounding box</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">x coordinate of the point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">y coordinate of the point</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-boolean\">boolean</em>\n                                    <span class=\"dr-description\"><code>true</code> if point is inside</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.isBBoxIntersect\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.isBBoxIntersect(bbox1, bbox2)\n                                <a href=\"#Snap.path.isBBoxIntersect\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1351 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1351\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.isBBoxIntersect-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Returns <code>true</code> if two bounding\n                                    boxes intersect\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">bbox1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">first bounding box</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">bbox2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">second bounding box</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-boolean\">boolean</em>\n                                    <span class=\"dr-description\"><code>true</code> if bounding boxes intersect</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.intersection\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.intersection(path1, path2)\n                                <a href=\"#Snap.path.intersection\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1375 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1375\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.intersection-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Finds intersections of two paths\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path1</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">path2</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">dots of intersection</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>[</li>\n                                    <li> {\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate of the point,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate of the point,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">t1:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">t value for segment of path1,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">t2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">t value for segment of path2,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">segment1:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">order number for segment of path1,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">segment2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">order number for segment of path2,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">bez1:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-array\">array</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">eight coordinates representing beziér\n                                                    curve for the segment of path1,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">bez2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-array\">array</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">eight coordinates representing beziér\n                                                    curve for the segment of path2</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li> }</li>\n                                    <li>]</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.isPointInside\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.isPointInside(path, x, y)\n                                <a href=\"#Snap.path.isPointInside\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1391 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1391\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.isPointInside-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Returns <code>true</code> if given\n                                    point is inside a given closed path.\n                                </p>\n                                <p>Note: fill mode doesn’t affect the result of this\n                                    method.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">x</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">x of the point</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">y</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">y of the point</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-boolean\">boolean</em>\n                                    <span class=\"dr-description\"><code>true</code> if point is inside the path</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.getBBox\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.getBBox(path)\n                                <a href=\"#Snap.path.getBBox\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1410 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1410\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.getBBox-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Returns the bounding box of a given\n                                    path\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">bounding box</span>\n                                </p>\n                                <ol class=\"dr-json\">\n                                    <li>{\n                                        <ol class=\"dr-json\">\n                                            <li>\n                                                <span class=\"dr-json-key\">x:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate of the left top point\n                                                    of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate of the left top point\n                                                    of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">x2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">x coordinate of the right bottom\n                                                    point of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">y2:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">y coordinate of the right bottom\n                                                    point of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">width:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">width of the box,</span>\n                                            </li>\n                                            <li>\n                                                <span class=\"dr-json-key\">height:</span>\n                                                <span class=\"dr-type\">\n                                                    <em class=\"dr-type-number\">number</em>\n                                                </span>\n                                                <span class=\"dr-json-description\">height of the box</span>\n                                            </li>\n                                        </ol>\n                                    </li>\n                                    <li>}</li>\n                                </ol>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.toRelative\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.toRelative(path)\n                                <a href=\"#Snap.path.toRelative\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1422 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1422\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.toRelative-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Converts path coordinates into relative\n                                    values\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">path string</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.toAbsolute\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.toAbsolute(path)\n                                <a href=\"#Snap.path.toAbsolute\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1433 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1433\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.toAbsolute-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Converts path coordinates into absolute\n                                    values\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">path string</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.toCubic\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.toCubic(pathString)\n                                <a href=\"#Snap.path.toCubic\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1444 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1444\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.toCubic-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Utility method Converts path to a new path where\n                                    all segments are cubic beziér curves\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">pathString</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string or array of segments</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-array\">array</em>\n                                    <span class=\"dr-description\">array of segments</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.path.map\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.path.map(path, matrix)\n                                <a href=\"#Snap.path.map\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 1454 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L1454\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.path.map-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Transform the path string with the given matrix\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">path</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">path string</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">matrix</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">see\n                                                <a href=\"#Matrix\" class=\"dr-link\">Matrix</a>\n                                            </span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-string\">string</em>\n                                    <span class=\"dr-description\">transformed path string</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.push\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.push()\n                                <a href=\"#Set.push\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 41 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L41\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.push-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Adds each argument to the current set\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">original element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.pop\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.pop()\n                                <a href=\"#Set.pop\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 61 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L61\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.pop-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes last element and returns it\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.forEach\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.forEach(callback, thisArg)\n                                <a href=\"#Set.forEach\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 77 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L77\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.forEach-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Executes given function for each element in the set\n                                </p>\n                                <p>If the function returns <code>false</code>, the loop\n                                    stops running.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">function to run</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">thisArg</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">context object for the callback</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Set object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.animate\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.animate(…)\n                                <a href=\"#Set.animate\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 106 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L106\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.animate-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Animates each element in set in sync.\n                                </p>\n                                <p></p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attrs</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">key-value pairs of destination attributes</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">duration</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">duration of the animation in milliseconds</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">easing</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">easing function from\n                                                <a href=\"#mina\"\n                                                class=\"dr-link\">mina</a> or custom</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">callback function that executes when\n                                                the animation ends</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">animation</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-array\">array</em>\n                                            </span>\n                                            <span class=\"dr-description\">array of animation parameter for each\n                                                element in set in format <code>[attrs, duration, easing, callback]</code></span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <h3>Usage</h3>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">// animate all elements in set to radius 10\nset.animate({r: 10}, 500, mina.easein);\n// or\n// animate first element to radius 10, but second to radius 20 and in different time\nset.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);</code></pre></section>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-Element\">Element</em>\n                                    <span class=\"dr-description\">the current element</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.remove\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.remove()\n                                <a href=\"#Set.remove\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 153 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L153\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.remove-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes all children of the set.\n                                </p>\n                                <p></p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Set object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.bind\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.bind(…)\n                                <a href=\"#Set.bind\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 178 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L178\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.bind-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Specifies how to handle a specific attribute when\n                                    applied to a set.\n                                </p>\n                                <p></p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">attribute name</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">callback</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-function\">function</em>\n                                            </span>\n                                            <span class=\"dr-description\">function to run</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">attribute name</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">element</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">specific element in the set to apply\n                                                the attribute to</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p>or\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">attr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">attribute name</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">element</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-Element\">Element</em>\n                                            </span>\n                                            <span class=\"dr-description\">specific element in the set to apply\n                                                the attribute to</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">eattr</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-string\">string</em>\n                                            </span>\n                                            <span class=\"dr-description\">attribute on the element to bind the\n                                                attribute to</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Set object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.attr\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.attr()\n                                <a href=\"#Set.attr\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 198 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L198\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.attr-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Equivalent of\n                                    <a href=\"#Element.attr\" class=\"dr-link\">Element.attr</a>.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Set object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.clear\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.clear()\n                                <a href=\"#Set.clear\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 218 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L218\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.clear-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes all elements from the set\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.splice\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.splice(index, count, [insertion…])\n                                <a href=\"#Set.splice\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 234 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L234\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.splice-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes range of elements from the set\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">index</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">position of the deletion</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">count</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-number\">number</em>\n                                            </span>\n                                            <span class=\"dr-description\">number of element to remove</span>\n                                        </li>\n                                        <li>\n                                            <span class=\"dr-param\">insertion…</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">elements to insert</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">set elements that were deleted</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.exclude\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.exclude(element)\n                                <a href=\"#Set.exclude\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 269 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L269\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.exclude-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Removes given element from the set\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">element</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">element to remove</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-boolean\">boolean</em>\n                                    <span class=\"dr-description\"><code>true</code> if object was found and removed\n                                        from the set</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"undefined\">\n                        <header>\n                            <h2 class=\"dr-method\">undefined\n                                <a href=\"#undefined\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 285 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L285\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"undefined-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Inserts set elements after given element.\n                                </p>\n                                <div class=\"params\">\n                                    <h3 class=\"params\">Parameters</h3>\n                                    <ol class=\"params-list\">\n                                        <li>\n                                            <span class=\"dr-param\">element</span>\n                                            <span class=\"dr-type\">\n                                                <em class=\"dr-type-object\">object</em>\n                                            </span>\n                                            <span class=\"dr-description\">set will be inserted after this element</span>\n                                        </li>\n                                    </ol>\n                                </div>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">Set object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.getBBox\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.getBBox()\n                                <a href=\"#Set.getBBox\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 299 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L299\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.getBBox-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Union of all bboxes of the set. See\n                                    <a href=\"#Element.getBBox\"\n                                    class=\"dr-link\">Element.getBBox</a>.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">bounding box descriptor. See\n                                        <a href=\"#Element.getBBox\"\n                                        class=\"dr-link\">Element.getBBox</a>.</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Set.insertAfter\">\n                        <header>\n                            <h2 class=\"dr-method\">Set.insertAfter()\n                                <a href=\"#Set.insertAfter\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 334 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L334\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Set.insertAfter-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a clone of the set.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">New Set object</span>\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.Set\">\n                        <header>\n                            <h2 class=\"dr-property\">Snap.Set\n                                <a href=\"#Snap.Set\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 352 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L352\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.Set-extra\"></div>\n                            <div class=\"dr-property\">\n                                <p>Set constructor.\n                                </p>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.set\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.set()\n                                <a href=\"#Snap.set\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 364 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L364\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.set-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Creates a set and fills it with list of arguments.\n                                </p>\n                                <p class=\"dr-returns\">\n                                    <strong class=\"dr-title\">Returns:</strong>\n                                    <em class=\"dr-type-object\">object</em>\n                                    <span class=\"dr-description\">New Set object</span>\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">var r = paper.rect(0, 0, 10, 10),\n    s1 = Snap.set(), // empty set\n    s2 = Snap.set(r, paper.circle(100, 100, 20)); // prefilled set</code></pre></section>\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.mui\">\n                        <header>\n                            <h2 class=\"dr-property\">Snap.mui()\n                                <a href=\"#Snap.mui\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 43 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L43\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.mui-extra\"></div>\n                            <div class=\"dr-property\">\n                                <p>Contain Material UI colours.\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">Snap().rect(0, 0, 10, 10).attr({fill: Snap.mui.deeppurple, stroke: Snap.mui.amber[600]});</code></pre></section>\n                                For colour reference:\n                                <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.flat\">\n                        <header>\n                            <h2 class=\"dr-property\">Snap.flat\n                                <a href=\"#Snap.flat\" title=\"Link to this section\"\n                                class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 52 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L52\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.flat-extra\"></div>\n                            <div class=\"dr-property\">\n                                <p>Contain Flat UI colours.\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">Snap().rect(0, 0, 10, 10).attr({fill: Snap.flat.carrot, stroke: Snap.flat.wetasphalt});</code></pre></section>\n                                For colour reference:\n                                <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n                            </div>\n                        </section>\n                    </article>\n                    <article id=\"Snap.importMUIColors\">\n                        <header>\n                            <h2 class=\"dr-method\">Snap.importMUIColors()\n                                <a href=\"#Snap.importMUIColors\"\n                                title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a>\n                                <a class=\"dr-sourceline\" title=\"Go to line 122 in the source\"\n                                href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L122\">&#x27ad;</a>\n                            </h2>\n                        </header>\n                        <section>\n                            <div class=\"extra\" id=\"Snap.importMUIColors-extra\"></div>\n                            <div class=\"dr-method\">\n                                <p>Imports Material UI colours into global object.\n                                </p>\n                                <section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">Snap.importMUIColors();\nSnap().rect(0, 0, 10, 10).attr({fill: deeppurple, stroke: amber[600]});</code></pre></section>\n                                For colour reference:\n                                <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n                            </div>\n                        </section>\n                    </article>\n                </div>\n                <footer></footer>\n            </div>\n        </div>\n        <!-- <script src=\"//use.edgefonts.net/source-sans-pro:n3,n4,n6;source-code-pro:n3.js\"></script> -->\n        <script src=\"/assets/docs/js/prism.js\"></script>\n        <script>!function(e){if(e){for(var t=function(e,t){var n=t.toUpperCase().split(\"\"),r=n.shift(),a=RegExp(\"^[\"+r.toLowerCase()+r+\"][a-z]*\"+n.join(\"[a-z]*\")+\"[a-z]*$\")\nreturn!!(e+\"\").match(a)},n=function(e,n){e+=\"\",n+=\"\"\nvar r,a=0\nif(e==n)return 1\nif(!e||!n)return 0\nif(t(e,n))return.9\na=0,r=e.toLowerCase()\nfor(var i,o=0,l=n.length;l>o;o++)i=r.indexOf(n.charAt(o)),~i&&(r=r.substring(i+1),a+=1/(i+1))\nreturn a=Math.max(a/l-Math.abs(e.length-l)/e.length/2,0)},r=e.getElementsByTagName(\"span\"),a=[],i=/[^\\.\\(]*(?=(\\(\\))?$)/,o=0,l=r.length;l>o;o++)a[o]={li:r[o].parentNode.parentNode,text:r[o].innerHTML.match(i)[0]}\nvar h=document.getElementById(\"dr-filter\"),f=function(e,t){return t.weight-e.weight}\nh.onclick=h.onchange=h.onkeydown=h.onkeyup=function(){var t=h.value,r=[]\nif(t.length>1){for(var i=0,o=a.length;o>i;i++)r[i]={li:a[i].li,weight:n(a[i].text,t)}\nr.sort(f)}else r=a\nfor(i=0,o=r.length;o>i;i++)e.appendChild(r[i].li)}}}(document.getElementById(\"dr-toc\"))</script>\n    </body>\n</html>"
  },
  {
    "path": "dr.json",
    "content": "{\n    \"title\": \"Snap.svg\",\n    \"output\": \"doc/reference.html\",\n    \"template\": \"template.dot\",\n    \"files\": [{\n        \"url\": \"src/svg.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js\"\n    }, {\n        \"url\": \"src/element.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/element.js\"\n    }, {\n        \"url\": \"src/attr.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/attr.js\"\n    }, {\n        \"url\": \"src/animation.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/animation.js\"\n    }, {\n        \"url\": \"src/matrix.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/matrix.js\"\n    }, {\n        \"url\": \"src/paper.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/paper.js\"\n    }, {\n        \"url\": \"src/class.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/class.js\"\n    }, {\n        \"url\": \"src/equal.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/equal.js\"\n    }, {\n        \"url\": \"src/mina.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/mina.js\"\n    }, {\n        \"url\": \"src/filter.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/filter.js\"\n    }, {\n        \"url\": \"src/mouse.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/mouse.js\"\n    }, {\n        \"url\": \"src/path.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/path.js\"\n    }, {\n        \"url\": \"src/set.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/set.js\"\n    }, {\n        \"url\": \"src/colors.js\",\n        \"link\": \"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/colors.js\"\n    }]\n}\n"
  },
  {
    "path": "history.md",
    "content": "#0.5.1\n\n* Bug fix\n\n#0.5.0\n\n* Added color palettes for Material and FlatUI\n* Added methods for gradients: `Element.stops()`, `Element.addStop()`, `Element.setStops()`\n* Fixed matrix splitting for better animation of matrices`\n* Various bug fixes\n* Better integration of tests and ESlint\n\n#0.4.1\n\n* Bug fixes.\n\n#0.4.0\n\n* Moved class and element related code into separate plugins\n* Added `Element.align()` and `Element.getAlign()` methods\n* Added animation support for `viewBox`\n* Added support for `<symbol>`\n* Added method `Paper.toDataURL()`\n* Added method `Snap.closest()`\n* Added methods to work with degrees instead of radians: `Snap.sin()`, `Snap.cos()`, `Snap.tan()`, `Snap.asin()`, `Snap.acos()`, `Snap.atan()` and `Snap.atan2()`\n* Added methods `Snap.len()`, `Snap.len2()` and `Snap.closestPoint()`\n* Added methods `Element.children()` and `Element.toJSON()`\n* Various bug fixes\n\n#0.3.0\n\n* Added `.addClass()`, `.removeClass()`, `.toggleClass()` and `.hasClass()` APIs\n* Added `Paper.mask()`, `Paper.ptrn()`, `Paper.use()`, `Paper.svg()`\n* Mask & pattern elements are sharing paper methods (just like group)\n* Added `Set.bind()` method\n* Added syncronisation for `Set.animate()`\n* Added opacity to the shadow filter\n* Added ability to specify attributes as `\"+=10\"` or `\"-=1em\"` or `\"*=2\"`\n* Fix negative scale\n* Fix for `path2curve`\n* Fixed shared `<defs>` issue\n* Various bug fixes\n\n#0.2.0\n\n* Added support for text path\n* Added `getBBox` method to the paper object\n* Added `Element.appendTo()` and `Element.prependTo()`\n* Added `getElementByPoint()`\n* Added `Set.remove()` method\n* Get rid of internal SVG parser in favor of the browser\n* Fix for `xlink:href` setting for images\n* Fix `Element.animate()`\n* Fix for animate and stroke-dashoffset\n* Absolute transforms fix\n* Fix for animation of SVG transformations, matrices and polygon points\n* Various bug fixes\n\n#0.1.0\n\n* Initial release\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"snapsvg\",\n    \"version\": \"0.5.1\",\n    \"description\": \"JavaScript Vector Library\",\n    \"main\": \"./dist/snap.svg.js\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git@github.com:adobe-webplatform/Snap.svg.git\"\n    },\n    \"author\": \"Dmitry Baranovskiy\",\n    \"license\": \"Apache-2.0\",\n    \"dependencies\": {\n        \"eve\": \"~0.5.1\"\n    },\n    \"devDependencies\": {\n        \"grunt\": \"~0.4.1\",\n        \"grunt-contrib-uglify\": \"~0.2.0\",\n        \"grunt-contrib-concat\": \"~0.3.0\",\n        \"grunt-exec\": \"~0.4.2\",\n        \"grunt-prettify\": \"0.4.0\",\n        \"mocha\": \"*\",\n        \"expect.js\": \"*\",\n        \"eslint\": \"*\",\n        \"dr.js\": \"~0.1.0\"\n    },\n    \"eslintConfig\": {\n        \"globals\": {\n            \"window\": true,\n            \"console\": true\n        },\n        \"rules\": {\n            \"block-scoped-var\": 0,\n            \"comma-dangle\": 0,\n            \"no-extra-parens\": 1,\n            \"no-shadow\": 0,\n            \"consistent-return\": 0,\n            \"eqeqeq\": 0,\n            \"no-new-wrappers\": 0,\n            \"no-sequences\": 1,\n            \"radix\": 2,\n            \"new-parens\": 0,\n            \"no-underscore-dangle\": 0,\n            \"no-path-concat\": 0,\n            \"strict\": 0,\n            \"camelcase\": 0,\n            \"no-extend-native\": 0,\n            \"no-loop-func\": 0,\n            \"new-cap\": 0,\n            \"no-unused-expressions\": 0,\n            \"no-mixed-requires\": 0,\n            \"quotes\": [\n                1,\n                \"double\",\n                \"avoid-escape\"\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "src/align.js",
    "content": "// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var box = Snap._.box,\n        is = Snap.is,\n        firstLetter = /^[^a-z]*([tbmlrc])/i,\n        toString = function () {\n            return \"T\" + this.dx + \",\" + this.dy;\n        };\n    /*\\\n     * Element.getAlign\n     [ method ]\n     **\n     * Returns shift needed to align the element relatively to given element.\n     * If no elements specified, parent `<svg>` container will be used.\n     - el (object) @optional alignment element\n     - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n     = (object|string) Object in format `{dx: , dy: }` also has a string representation as a transformation string\n     > Usage\n     | el.transform(el.getAlign(el2, \"top\"));\n     * or\n     | var dy = el.getAlign(el2, \"top\").dy;\n    \\*/\n    Element.prototype.getAlign = function (el, way) {\n        if (way == null && is(el, \"string\")) {\n            way = el;\n            el = null;\n        }\n        el = el || this.paper;\n        var bx = el.getBBox ? el.getBBox() : box(el),\n            bb = this.getBBox(),\n            out = {};\n        way = way && way.match(firstLetter);\n        way = way ? way[1].toLowerCase() : \"c\";\n        switch (way) {\n            case \"t\":\n                out.dx = 0;\n                out.dy = bx.y - bb.y;\n            break;\n            case \"b\":\n                out.dx = 0;\n                out.dy = bx.y2 - bb.y2;\n            break;\n            case \"m\":\n                out.dx = 0;\n                out.dy = bx.cy - bb.cy;\n            break;\n            case \"l\":\n                out.dx = bx.x - bb.x;\n                out.dy = 0;\n            break;\n            case \"r\":\n                out.dx = bx.x2 - bb.x2;\n                out.dy = 0;\n            break;\n            default:\n                out.dx = bx.cx - bb.cx;\n                out.dy = 0;\n            break;\n        }\n        out.toString = toString;\n        return out;\n    };\n    /*\\\n     * Element.align\n     [ method ]\n     **\n     * Aligns the element relatively to given one via transformation.\n     * If no elements specified, parent `<svg>` container will be used.\n     - el (object) @optional alignment element\n     - way (string) one of six values: `\"top\"`, `\"middle\"`, `\"bottom\"`, `\"left\"`, `\"center\"`, `\"right\"`\n     = (object) this element\n     > Usage\n     | el.align(el2, \"top\");\n     * or\n     | el.align(\"middle\");\n    \\*/\n    Element.prototype.align = function (el, way) {\n        return this.transform(\"...\" + this.getAlign(el, way));\n    };\n});\n"
  },
  {
    "path": "src/amd-banner.js",
    "content": "(function (glob, factory) {\n    // AMD support\n    if (typeof define == \"function\" && define.amd) {\n        // Define as an anonymous module\n        define([\"eve\"], function (eve) {\n            return factory(glob, eve);\n        });\n    } else if (typeof exports != \"undefined\") {\n        // Next for Node.js or CommonJS\n        var eve = require(\"eve\");\n        module.exports = factory(glob, eve);\n    } else {\n        // Browser globals (glob is window)\n        // Snap adds itself to window\n        factory(glob, glob.eve);\n    }\n}(window || this, function (window, eve) {\n"
  },
  {
    "path": "src/amd-footer.js",
    "content": "return Snap;\n}));"
  },
  {
    "path": "src/animation.js",
    "content": "// Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        Str = String,\n        has = \"hasOwnProperty\";\n    function slice(from, to, f) {\n        return function (arr) {\n            var res = arr.slice(from, to);\n            if (res.length == 1) {\n                res = res[0];\n            }\n            return f ? f(res) : res;\n        };\n    }\n    var Animation = function (attr, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        this.attr = attr;\n        this.dur = ms;\n        easing && (this.easing = easing);\n        callback && (this.callback = callback);\n    };\n    Snap._.Animation = Animation;\n    /*\\\n     * Snap.animation\n     [ method ]\n     **\n     * Creates an animation object\n     **\n     - attr (object) attributes of final destination\n     - duration (number) duration of the animation, in milliseconds\n     - easing (function) #optional one of easing functions of @mina or custom one\n     - callback (function) #optional callback function that fires when animation ends\n     = (object) animation object\n    \\*/\n    Snap.animation = function (attr, ms, easing, callback) {\n        return new Animation(attr, ms, easing, callback);\n    };\n    /*\\\n     * Element.inAnim\n     [ method ]\n     **\n     * Returns a set of animations that may be able to manipulate the current element\n     **\n     = (object) in format:\n     o {\n     o     anim (object) animation object,\n     o     mina (object) @mina object,\n     o     curStatus (number) 0..1 — status of the animation: 0 — just started, 1 — just finished,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n    \\*/\n    elproto.inAnim = function () {\n        var el = this,\n            res = [];\n        for (var id in el.anims) if (el.anims[has](id)) {\n            (function (a) {\n                res.push({\n                    anim: new Animation(a._attrs, a.dur, a.easing, a._callback),\n                    mina: a,\n                    curStatus: a.status(),\n                    status: function (val) {\n                        return a.status(val);\n                    },\n                    stop: function () {\n                        a.stop();\n                    }\n                });\n            }(el.anims[id]));\n        }\n        return res;\n    };\n    /*\\\n     * Snap.animate\n     [ method ]\n     **\n     * Runs generic animation of one number into another with a caring function\n     **\n     - from (number|array) number or array of numbers\n     - to (number|array) number or array of numbers\n     - setter (function) caring function that accepts one number argument\n     - duration (number) duration, in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function to execute when animation ends\n     = (object) animation object in @mina format\n     o {\n     o     id (string) animation id, consider it read-only,\n     o     duration (function) gets or sets the duration of the animation,\n     o     easing (function) easing,\n     o     speed (function) gets or sets the speed of the animation,\n     o     status (function) gets or sets the status of the animation,\n     o     stop (function) stops the animation\n     o }\n     | var rect = Snap().rect(0, 0, 10, 10);\n     | Snap.animate(0, 10, function (val) {\n     |     rect.attr({\n     |         x: val\n     |     });\n     | }, 1000);\n     | // in given context is equivalent to\n     | rect.animate({x: 10}, 1000);\n    \\*/\n    Snap.animate = function (from, to, setter, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        var now = mina.time(),\n            anim = mina(from, to, now, now + ms, mina.time, setter, easing);\n        callback && eve.once(\"mina.finish.\" + anim.id, callback);\n        return anim;\n    };\n    /*\\\n     * Element.stop\n     [ method ]\n     **\n     * Stops all the animations for the current element\n     **\n     = (Element) the current element\n    \\*/\n    elproto.stop = function () {\n        var anims = this.inAnim();\n        for (var i = 0, ii = anims.length; i < ii; i++) {\n            anims[i].stop();\n        }\n        return this;\n    };\n    /*\\\n     * Element.animate\n     [ method ]\n     **\n     * Animates the given attributes of the element\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     = (Element) the current element\n    \\*/\n    elproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = attrs.dur;\n            attrs = attrs.attr;\n        }\n        var fkeys = [], tkeys = [], keys = {}, from, to, f, eq,\n            el = this;\n        for (var key in attrs) if (attrs[has](key)) {\n            if (el.equal) {\n                eq = el.equal(key, Str(attrs[key]));\n                from = eq.from;\n                to = eq.to;\n                f = eq.f;\n            } else {\n                from = +el.attr(key);\n                to = +attrs[key];\n            }\n            var len = is(from, \"array\") ? from.length : 1;\n            keys[key] = slice(fkeys.length, fkeys.length + len, f);\n            fkeys = fkeys.concat(from);\n            tkeys = tkeys.concat(to);\n        }\n        var now = mina.time(),\n            anim = mina(fkeys, tkeys, now, now + ms, mina.time, function (val) {\n                var attr = {};\n                for (var key in keys) if (keys[has](key)) {\n                    attr[key] = keys[key](val);\n                }\n                el.attr(attr);\n            }, easing);\n        el.anims[anim.id] = anim;\n        anim._attrs = attrs;\n        anim._callback = callback;\n        eve(\"snap.animcreated.\" + el.id, anim);\n        eve.once(\"mina.finish.\" + anim.id, function () {\n            eve.off(\"mina.*.\" + anim.id);\n            delete el.anims[anim.id];\n            callback && callback.call(el);\n        });\n        eve.once(\"mina.stop.\" + anim.id, function () {\n            eve.off(\"mina.*.\" + anim.id);\n            delete el.anims[anim.id];\n        });\n        return el;\n    };\n});\n"
  },
  {
    "path": "src/attr.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var has = \"hasOwnProperty\",\n        make = Snap._.make,\n        wrap = Snap._.wrap,\n        is = Snap.is,\n        getSomeDefs = Snap._.getSomeDefs,\n        reURLValue = /^url\\((['\"]?)([^)]+)\\1\\)$/,\n        $ = Snap._.$,\n        URL = Snap.url,\n        Str = String,\n        separator = Snap._.separator,\n        E = \"\";\n    /*\\\n     * Snap.deurl\n     [ method ]\n     **\n     * Unwraps path from `\"url(<path>)\"`.\n     - value (string) url path\n     = (string) unwrapped path\n    \\*/\n    Snap.deurl = function (value) {\n        var res = String(value).match(reURLValue);\n        return res ? res[2] : value;\n    }\n    // Attributes event handlers\n    eve.on(\"snap.util.attr.mask\", function (value) {\n        if (value instanceof Element || value instanceof Fragment) {\n            eve.stop();\n            if (value instanceof Fragment && value.node.childNodes.length == 1) {\n                value = value.node.firstChild;\n                getSomeDefs(this).appendChild(value);\n                value = wrap(value);\n            }\n            if (value.type == \"mask\") {\n                var mask = value;\n            } else {\n                mask = make(\"mask\", getSomeDefs(this));\n                mask.node.appendChild(value.node);\n            }\n            !mask.node.id && $(mask.node, {\n                id: mask.id\n            });\n            $(this.node, {\n                mask: URL(mask.id)\n            });\n        }\n    });\n    (function (clipIt) {\n        eve.on(\"snap.util.attr.clip\", clipIt);\n        eve.on(\"snap.util.attr.clip-path\", clipIt);\n        eve.on(\"snap.util.attr.clipPath\", clipIt);\n    }(function (value) {\n        if (value instanceof Element || value instanceof Fragment) {\n            eve.stop();\n            var clip,\n                node = value.node;\n            while (node) {\n                if (node.nodeName === \"clipPath\") {\n                    clip = new Element(node);\n                    break;\n                }\n                if (node.nodeName === \"svg\") {\n                    clip = undefined;\n                    break;\n                }\n                node = node.parentNode;\n            }\n            if (!clip) {\n                clip = make(\"clipPath\", getSomeDefs(this));\n                clip.node.appendChild(value.node);\n                !clip.node.id && $(clip.node, {\n                    id: clip.id\n                });\n            }\n            $(this.node, {\n                \"clip-path\": URL(clip.node.id || clip.id)\n            });\n        }\n    }));\n    function fillStroke(name) {\n        return function (value) {\n            eve.stop();\n            if (value instanceof Fragment && value.node.childNodes.length == 1 &&\n                (value.node.firstChild.tagName == \"radialGradient\" ||\n                value.node.firstChild.tagName == \"linearGradient\" ||\n                value.node.firstChild.tagName == \"pattern\")) {\n                value = value.node.firstChild;\n                getSomeDefs(this).appendChild(value);\n                value = wrap(value);\n            }\n            if (value instanceof Element) {\n                if (value.type == \"radialGradient\" || value.type == \"linearGradient\"\n                   || value.type == \"pattern\") {\n                    if (!value.node.id) {\n                        $(value.node, {\n                            id: value.id\n                        });\n                    }\n                    var fill = URL(value.node.id);\n                } else {\n                    fill = value.attr(name);\n                }\n            } else {\n                fill = Snap.color(value);\n                if (fill.error) {\n                    var grad = Snap(getSomeDefs(this).ownerSVGElement).gradient(value);\n                    if (grad) {\n                        if (!grad.node.id) {\n                            $(grad.node, {\n                                id: grad.id\n                            });\n                        }\n                        fill = URL(grad.node.id);\n                    } else {\n                        fill = value;\n                    }\n                } else {\n                    fill = Str(fill);\n                }\n            }\n            var attrs = {};\n            attrs[name] = fill;\n            $(this.node, attrs);\n            this.node.style[name] = E;\n        };\n    }\n    eve.on(\"snap.util.attr.fill\", fillStroke(\"fill\"));\n    eve.on(\"snap.util.attr.stroke\", fillStroke(\"stroke\"));\n    var gradrg = /^([lr])(?:\\(([^)]*)\\))?(.*)$/i;\n    eve.on(\"snap.util.grad.parse\", function parseGrad(string) {\n        string = Str(string);\n        var tokens = string.match(gradrg);\n        if (!tokens) {\n            return null;\n        }\n        var type = tokens[1],\n            params = tokens[2],\n            stops = tokens[3];\n        params = params.split(/\\s*,\\s*/).map(function (el) {\n            return +el == el ? +el : el;\n        });\n        if (params.length == 1 && params[0] == 0) {\n            params = [];\n        }\n        stops = stops.split(\"-\");\n        stops = stops.map(function (el) {\n            el = el.split(\":\");\n            var out = {\n                color: el[0]\n            };\n            if (el[1]) {\n                out.offset = parseFloat(el[1]);\n            }\n            return out;\n        });\n        var len = stops.length,\n            start = 0,\n            j = 0;\n        function seed(i, end) {\n            var step = (end - start) / (i - j);\n            for (var k = j; k < i; k++) {\n                stops[k].offset = +(+start + step * (k - j)).toFixed(2);\n            }\n            j = i;\n            start = end;\n        }\n        len--;\n        for (var i = 0; i < len; i++) if (\"offset\" in stops[i]) {\n            seed(i, stops[i].offset);\n        }\n        stops[len].offset = stops[len].offset || 100;\n        seed(len, stops[len].offset);\n        return {\n            type: type,\n            params: params,\n            stops: stops\n        };\n    });\n\n    eve.on(\"snap.util.attr.d\", function (value) {\n        eve.stop();\n        if (is(value, \"array\") && is(value[0], \"array\")) {\n            value = Snap.path.toString.call(value);\n        }\n        value = Str(value);\n        if (value.match(/[ruo]/i)) {\n            value = Snap.path.toAbsolute(value);\n        }\n        $(this.node, {d: value});\n    })(-1);\n    eve.on(\"snap.util.attr.#text\", function (value) {\n        eve.stop();\n        value = Str(value);\n        var txt = glob.doc.createTextNode(value);\n        while (this.node.firstChild) {\n            this.node.removeChild(this.node.firstChild);\n        }\n        this.node.appendChild(txt);\n    })(-1);\n    eve.on(\"snap.util.attr.path\", function (value) {\n        eve.stop();\n        this.attr({d: value});\n    })(-1);\n    eve.on(\"snap.util.attr.class\", function (value) {\n        eve.stop();\n        this.node.className.baseVal = value;\n    })(-1);\n    eve.on(\"snap.util.attr.viewBox\", function (value) {\n        var vb;\n        if (is(value, \"object\") && \"x\" in value) {\n            vb = [value.x, value.y, value.width, value.height].join(\" \");\n        } else if (is(value, \"array\")) {\n            vb = value.join(\" \");\n        } else {\n            vb = value;\n        }\n        $(this.node, {\n            viewBox: vb\n        });\n        eve.stop();\n    })(-1);\n    eve.on(\"snap.util.attr.transform\", function (value) {\n        this.transform(value);\n        eve.stop();\n    })(-1);\n    eve.on(\"snap.util.attr.r\", function (value) {\n        if (this.type == \"rect\") {\n            eve.stop();\n            $(this.node, {\n                rx: value,\n                ry: value\n            });\n        }\n    })(-1);\n    eve.on(\"snap.util.attr.textpath\", function (value) {\n        eve.stop();\n        if (this.type == \"text\") {\n            var id, tp, node;\n            if (!value && this.textPath) {\n                tp = this.textPath;\n                while (tp.node.firstChild) {\n                    this.node.appendChild(tp.node.firstChild);\n                }\n                tp.remove();\n                delete this.textPath;\n                return;\n            }\n            if (is(value, \"string\")) {\n                var defs = getSomeDefs(this),\n                    path = wrap(defs.parentNode).path(value);\n                defs.appendChild(path.node);\n                id = path.id;\n                path.attr({id: id});\n            } else {\n                value = wrap(value);\n                if (value instanceof Element) {\n                    id = value.attr(\"id\");\n                    if (!id) {\n                        id = value.id;\n                        value.attr({id: id});\n                    }\n                }\n            }\n            if (id) {\n                tp = this.textPath;\n                node = this.node;\n                if (tp) {\n                    tp.attr({\"xlink:href\": \"#\" + id});\n                } else {\n                    tp = $(\"textPath\", {\n                        \"xlink:href\": \"#\" + id\n                    });\n                    while (node.firstChild) {\n                        tp.appendChild(node.firstChild);\n                    }\n                    node.appendChild(tp);\n                    this.textPath = wrap(tp);\n                }\n            }\n        }\n    })(-1);\n    eve.on(\"snap.util.attr.text\", function (value) {\n        if (this.type == \"text\") {\n            var i = 0,\n                node = this.node,\n                tuner = function (chunk) {\n                    var out = $(\"tspan\");\n                    if (is(chunk, \"array\")) {\n                        for (var i = 0; i < chunk.length; i++) {\n                            out.appendChild(tuner(chunk[i]));\n                        }\n                    } else {\n                        out.appendChild(glob.doc.createTextNode(chunk));\n                    }\n                    out.normalize && out.normalize();\n                    return out;\n                };\n            while (node.firstChild) {\n                node.removeChild(node.firstChild);\n            }\n            var tuned = tuner(value);\n            while (tuned.firstChild) {\n                node.appendChild(tuned.firstChild);\n            }\n        }\n        eve.stop();\n    })(-1);\n    function setFontSize(value) {\n        eve.stop();\n        if (value == +value) {\n            value += \"px\";\n        }\n        this.node.style.fontSize = value;\n    }\n    eve.on(\"snap.util.attr.fontSize\", setFontSize)(-1);\n    eve.on(\"snap.util.attr.font-size\", setFontSize)(-1);\n\n\n    eve.on(\"snap.util.getattr.transform\", function () {\n        eve.stop();\n        return this.transform();\n    })(-1);\n    eve.on(\"snap.util.getattr.textpath\", function () {\n        eve.stop();\n        return this.textPath;\n    })(-1);\n    // Markers\n    (function () {\n        function getter(end) {\n            return function () {\n                eve.stop();\n                var style = glob.doc.defaultView.getComputedStyle(this.node, null).getPropertyValue(\"marker-\" + end);\n                if (style == \"none\") {\n                    return style;\n                } else {\n                    return Snap(glob.doc.getElementById(style.match(reURLValue)[1]));\n                }\n            };\n        }\n        function setter(end) {\n            return function (value) {\n                eve.stop();\n                var name = \"marker\" + end.charAt(0).toUpperCase() + end.substring(1);\n                if (value == \"\" || !value) {\n                    this.node.style[name] = \"none\";\n                    return;\n                }\n                if (value.type == \"marker\") {\n                    var id = value.node.id;\n                    if (!id) {\n                        $(value.node, {id: value.id});\n                    }\n                    this.node.style[name] = URL(id);\n                    return;\n                }\n            };\n        }\n        eve.on(\"snap.util.getattr.marker-end\", getter(\"end\"))(-1);\n        eve.on(\"snap.util.getattr.markerEnd\", getter(\"end\"))(-1);\n        eve.on(\"snap.util.getattr.marker-start\", getter(\"start\"))(-1);\n        eve.on(\"snap.util.getattr.markerStart\", getter(\"start\"))(-1);\n        eve.on(\"snap.util.getattr.marker-mid\", getter(\"mid\"))(-1);\n        eve.on(\"snap.util.getattr.markerMid\", getter(\"mid\"))(-1);\n        eve.on(\"snap.util.attr.marker-end\", setter(\"end\"))(-1);\n        eve.on(\"snap.util.attr.markerEnd\", setter(\"end\"))(-1);\n        eve.on(\"snap.util.attr.marker-start\", setter(\"start\"))(-1);\n        eve.on(\"snap.util.attr.markerStart\", setter(\"start\"))(-1);\n        eve.on(\"snap.util.attr.marker-mid\", setter(\"mid\"))(-1);\n        eve.on(\"snap.util.attr.markerMid\", setter(\"mid\"))(-1);\n    }());\n    eve.on(\"snap.util.getattr.r\", function () {\n        if (this.type == \"rect\" && $(this.node, \"rx\") == $(this.node, \"ry\")) {\n            eve.stop();\n            return $(this.node, \"rx\");\n        }\n    })(-1);\n    function textExtract(node) {\n        var out = [];\n        var children = node.childNodes;\n        for (var i = 0, ii = children.length; i < ii; i++) {\n            var chi = children[i];\n            if (chi.nodeType == 3) {\n                out.push(chi.nodeValue);\n            }\n            if (chi.tagName == \"tspan\") {\n                if (chi.childNodes.length == 1 && chi.firstChild.nodeType == 3) {\n                    out.push(chi.firstChild.nodeValue);\n                } else {\n                    out.push(textExtract(chi));\n                }\n            }\n        }\n        return out;\n    }\n    eve.on(\"snap.util.getattr.text\", function () {\n        if (this.type == \"text\" || this.type == \"tspan\") {\n            eve.stop();\n            var out = textExtract(this.node);\n            return out.length == 1 ? out[0] : out;\n        }\n    })(-1);\n    eve.on(\"snap.util.getattr.#text\", function () {\n        return this.node.textContent;\n    })(-1);\n    eve.on(\"snap.util.getattr.fill\", function (internal) {\n        if (internal) {\n            return;\n        }\n        eve.stop();\n        var value = eve(\"snap.util.getattr.fill\", this, true).firstDefined();\n        return Snap(Snap.deurl(value)) || value;\n    })(-1);\n    eve.on(\"snap.util.getattr.stroke\", function (internal) {\n        if (internal) {\n            return;\n        }\n        eve.stop();\n        var value = eve(\"snap.util.getattr.stroke\", this, true).firstDefined();\n        return Snap(Snap.deurl(value)) || value;\n    })(-1);\n    eve.on(\"snap.util.getattr.viewBox\", function () {\n        eve.stop();\n        var vb = $(this.node, \"viewBox\");\n        if (vb) {\n            vb = vb.split(separator);\n            return Snap._.box(+vb[0], +vb[1], +vb[2], +vb[3]);\n        } else {\n            return;\n        }\n    })(-1);\n    eve.on(\"snap.util.getattr.points\", function () {\n        var p = $(this.node, \"points\");\n        eve.stop();\n        if (p) {\n            return p.split(separator);\n        } else {\n            return;\n        }\n    })(-1);\n    eve.on(\"snap.util.getattr.path\", function () {\n        var p = $(this.node, \"d\");\n        eve.stop();\n        return p;\n    })(-1);\n    eve.on(\"snap.util.getattr.class\", function () {\n        return this.node.className.baseVal;\n    })(-1);\n    function getFontSize() {\n        eve.stop();\n        return this.node.style.fontSize;\n    }\n    eve.on(\"snap.util.getattr.fontSize\", getFontSize)(-1);\n    eve.on(\"snap.util.getattr.font-size\", getFontSize)(-1);\n});\n"
  },
  {
    "path": "src/attradd.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var operators = {\n            \"+\": function (x, y) {\n                    return x + y;\n                },\n            \"-\": function (x, y) {\n                    return x - y;\n                },\n            \"/\": function (x, y) {\n                    return x / y;\n                },\n            \"*\": function (x, y) {\n                    return x * y;\n                }\n        },\n        Str = String,\n        reUnit = /[a-z]+$/i,\n        reAddon = /^\\s*([+\\-\\/*])\\s*=\\s*([\\d.eE+\\-]+)\\s*([^\\d\\s]+)?\\s*$/;\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    eve.on(\"snap.util.attr\", function (val) {\n        var plus = Str(val).match(reAddon);\n        if (plus) {\n            var evnt = eve.nt(),\n                name = evnt.substring(evnt.lastIndexOf(\".\") + 1),\n                a = this.attr(name),\n                atr = {};\n            eve.stop();\n            var unit = plus[3] || \"\",\n                aUnit = a.match(reUnit),\n                op = operators[plus[1]];\n            if (aUnit && aUnit == unit) {\n                val = op(parseFloat(a), +plus[2]);\n            } else {\n                a = this.asPX(name);\n                val = op(this.asPX(name), this.asPX(name, plus[2] + unit));\n            }\n            if (isNaN(a) || isNaN(val)) {\n                return;\n            }\n            atr[name] = val;\n            this.attr(atr);\n        }\n    })(-10);\n    eve.on(\"snap.util.equal\", function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this,\n            bplus = Str(b).match(reAddon);\n        if (bplus) {\n            eve.stop();\n            var unit = bplus[3] || \"\",\n                aUnit = a.match(reUnit),\n                op = operators[bplus[1]];\n            if (aUnit && aUnit == unit) {\n                return {\n                    from: parseFloat(a),\n                    to: op(parseFloat(a), +bplus[2]),\n                    f: getUnit(aUnit)\n                };\n            } else {\n                a = this.asPX(name);\n                return {\n                    from: a,\n                    to: op(a, this.asPX(name, bplus[2] + unit)),\n                    f: getNumber\n                };\n            }\n        }\n    })(-10);\n});\n"
  },
  {
    "path": "src/class.js",
    "content": "// Copyright (c) 2014 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var rgNotSpace = /\\S+/g,\n        rgBadSpace = /[\\t\\r\\n\\f]/g,\n        rgTrim = /(^\\s+|\\s+$)/g,\n        Str = String,\n        elproto = Element.prototype;\n    /*\\\n     * Element.addClass\n     [ method ]\n     **\n     * Adds given class name or list of class names to the element.\n     - value (string) class name or space separated list of class names\n     **\n     = (Element) original element.\n    \\*/\n    elproto.addClass = function (value) {\n        var classes = Str(value || \"\").match(rgNotSpace) || [],\n            elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [],\n            j,\n            pos,\n            clazz,\n            finalValue;\n\n        if (classes.length) {\n            j = 0;\n            while (clazz = classes[j++]) {\n                pos = curClasses.indexOf(clazz);\n                if (!~pos) {\n                    curClasses.push(clazz);\n                }\n            }\n\n            finalValue = curClasses.join(\" \");\n            if (className != finalValue) {\n                elem.className.baseVal = finalValue;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Element.removeClass\n     [ method ]\n     **\n     * Removes given class name or list of class names from the element.\n     - value (string) class name or space separated list of class names\n     **\n     = (Element) original element.\n    \\*/\n    elproto.removeClass = function (value) {\n        var classes = Str(value || \"\").match(rgNotSpace) || [],\n            elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [],\n            j,\n            pos,\n            clazz,\n            finalValue;\n        if (curClasses.length) {\n            j = 0;\n            while (clazz = classes[j++]) {\n                pos = curClasses.indexOf(clazz);\n                if (~pos) {\n                    curClasses.splice(pos, 1);\n                }\n            }\n\n            finalValue = curClasses.join(\" \");\n            if (className != finalValue) {\n                elem.className.baseVal = finalValue;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Element.hasClass\n     [ method ]\n     **\n     * Checks if the element has a given class name in the list of class names applied to it.\n     - value (string) class name\n     **\n     = (boolean) `true` if the element has given class\n    \\*/\n    elproto.hasClass = function (value) {\n        var elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [];\n        return !!~curClasses.indexOf(value);\n    };\n    /*\\\n     * Element.toggleClass\n     [ method ]\n     **\n     * Add or remove one or more classes from the element, depending on either\n     * the class’s presence or the value of the `flag` argument.\n     - value (string) class name or space separated list of class names\n     - flag (boolean) value to determine whether the class should be added or removed\n     **\n     = (Element) original element.\n    \\*/\n    elproto.toggleClass = function (value, flag) {\n        if (flag != null) {\n            if (flag) {\n                return this.addClass(value);\n            } else {\n                return this.removeClass(value);\n            }\n        }\n        var classes = (value || \"\").match(rgNotSpace) || [],\n            elem = this.node,\n            className = elem.className.baseVal,\n            curClasses = className.match(rgNotSpace) || [],\n            j,\n            pos,\n            clazz,\n            finalValue;\n        j = 0;\n        while (clazz = classes[j++]) {\n            pos = curClasses.indexOf(clazz);\n            if (~pos) {\n                curClasses.splice(pos, 1);\n            } else {\n                curClasses.push(clazz);\n            }\n        }\n\n        finalValue = curClasses.join(\" \");\n        if (className != finalValue) {\n            elem.className.baseVal = finalValue;\n        }\n        return this;\n    };\n});\n"
  },
  {
    "path": "src/colors.js",
    "content": "// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    // Colours are from https://www.materialui.co\n    var red         = \"#ffebee#ffcdd2#ef9a9a#e57373#ef5350#f44336#e53935#d32f2f#c62828#b71c1c#ff8a80#ff5252#ff1744#d50000\",\n        pink        = \"#FCE4EC#F8BBD0#F48FB1#F06292#EC407A#E91E63#D81B60#C2185B#AD1457#880E4F#FF80AB#FF4081#F50057#C51162\",\n        purple      = \"#F3E5F5#E1BEE7#CE93D8#BA68C8#AB47BC#9C27B0#8E24AA#7B1FA2#6A1B9A#4A148C#EA80FC#E040FB#D500F9#AA00FF\",\n        deeppurple  = \"#EDE7F6#D1C4E9#B39DDB#9575CD#7E57C2#673AB7#5E35B1#512DA8#4527A0#311B92#B388FF#7C4DFF#651FFF#6200EA\",\n        indigo      = \"#E8EAF6#C5CAE9#9FA8DA#7986CB#5C6BC0#3F51B5#3949AB#303F9F#283593#1A237E#8C9EFF#536DFE#3D5AFE#304FFE\",\n        blue        = \"#E3F2FD#BBDEFB#90CAF9#64B5F6#64B5F6#2196F3#1E88E5#1976D2#1565C0#0D47A1#82B1FF#448AFF#2979FF#2962FF\",\n        lightblue   = \"#E1F5FE#B3E5FC#81D4FA#4FC3F7#29B6F6#03A9F4#039BE5#0288D1#0277BD#01579B#80D8FF#40C4FF#00B0FF#0091EA\",\n        cyan        = \"#E0F7FA#B2EBF2#80DEEA#4DD0E1#26C6DA#00BCD4#00ACC1#0097A7#00838F#006064#84FFFF#18FFFF#00E5FF#00B8D4\",\n        teal        = \"#E0F2F1#B2DFDB#80CBC4#4DB6AC#26A69A#009688#00897B#00796B#00695C#004D40#A7FFEB#64FFDA#1DE9B6#00BFA5\",\n        green       = \"#E8F5E9#C8E6C9#A5D6A7#81C784#66BB6A#4CAF50#43A047#388E3C#2E7D32#1B5E20#B9F6CA#69F0AE#00E676#00C853\",\n        lightgreen  = \"#F1F8E9#DCEDC8#C5E1A5#AED581#9CCC65#8BC34A#7CB342#689F38#558B2F#33691E#CCFF90#B2FF59#76FF03#64DD17\",\n        lime        = \"#F9FBE7#F0F4C3#E6EE9C#DCE775#D4E157#CDDC39#C0CA33#AFB42B#9E9D24#827717#F4FF81#EEFF41#C6FF00#AEEA00\",\n        yellow      = \"#FFFDE7#FFF9C4#FFF59D#FFF176#FFEE58#FFEB3B#FDD835#FBC02D#F9A825#F57F17#FFFF8D#FFFF00#FFEA00#FFD600\",\n        amber       = \"#FFF8E1#FFECB3#FFE082#FFD54F#FFCA28#FFC107#FFB300#FFA000#FF8F00#FF6F00#FFE57F#FFD740#FFC400#FFAB00\",\n        orange      = \"#FFF3E0#FFE0B2#FFCC80#FFB74D#FFA726#FF9800#FB8C00#F57C00#EF6C00#E65100#FFD180#FFAB40#FF9100#FF6D00\",\n        deeporange  = \"#FBE9E7#FFCCBC#FFAB91#FF8A65#FF7043#FF5722#F4511E#E64A19#D84315#BF360C#FF9E80#FF6E40#FF3D00#DD2C00\",\n        brown       = \"#EFEBE9#D7CCC8#BCAAA4#A1887F#8D6E63#795548#6D4C41#5D4037#4E342E#3E2723\",\n        grey        = \"#FAFAFA#F5F5F5#EEEEEE#E0E0E0#BDBDBD#9E9E9E#757575#616161#424242#212121\",\n        bluegrey    = \"#ECEFF1#CFD8DC#B0BEC5#90A4AE#78909C#607D8B#546E7A#455A64#37474F#263238\";\n    /*\\\n     * Snap.mui\n     [ property ]\n     **\n     * Contain Material UI colours.\n     | Snap().rect(0, 0, 10, 10).attr({fill: Snap.mui.deeppurple, stroke: Snap.mui.amber[600]});\n     # For colour reference: <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n    \\*/\n    Snap.mui = {};\n    /*\\\n     * Snap.flat\n     [ property ]\n     **\n     * Contain Flat UI colours.\n     | Snap().rect(0, 0, 10, 10).attr({fill: Snap.flat.carrot, stroke: Snap.flat.wetasphalt});\n     # For colour reference: <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n    \\*/\n    Snap.flat = {};\n    function saveColor(colors) {\n        colors = colors.split(/(?=#)/);\n        var color = new String(colors[5]);\n        color[50] = colors[0];\n        color[100] = colors[1];\n        color[200] = colors[2];\n        color[300] = colors[3];\n        color[400] = colors[4];\n        color[500] = colors[5];\n        color[600] = colors[6];\n        color[700] = colors[7];\n        color[800] = colors[8];\n        color[900] = colors[9];\n        if (colors[10]) {\n            color.A100 = colors[10];\n            color.A200 = colors[11];\n            color.A400 = colors[12];\n            color.A700 = colors[13];\n        }\n        return color;\n    }\n    Snap.mui.red = saveColor(red);\n    Snap.mui.pink = saveColor(pink);\n    Snap.mui.purple = saveColor(purple);\n    Snap.mui.deeppurple = saveColor(deeppurple);\n    Snap.mui.indigo = saveColor(indigo);\n    Snap.mui.blue = saveColor(blue);\n    Snap.mui.lightblue = saveColor(lightblue);\n    Snap.mui.cyan = saveColor(cyan);\n    Snap.mui.teal = saveColor(teal);\n    Snap.mui.green = saveColor(green);\n    Snap.mui.lightgreen = saveColor(lightgreen);\n    Snap.mui.lime = saveColor(lime);\n    Snap.mui.yellow = saveColor(yellow);\n    Snap.mui.amber = saveColor(amber);\n    Snap.mui.orange = saveColor(orange);\n    Snap.mui.deeporange = saveColor(deeporange);\n    Snap.mui.brown = saveColor(brown);\n    Snap.mui.grey = saveColor(grey);\n    Snap.mui.bluegrey = saveColor(bluegrey);\n    Snap.flat.turquoise = \"#1abc9c\";\n    Snap.flat.greensea = \"#16a085\";\n    Snap.flat.sunflower = \"#f1c40f\";\n    Snap.flat.orange = \"#f39c12\";\n    Snap.flat.emerland = \"#2ecc71\";\n    Snap.flat.nephritis = \"#27ae60\";\n    Snap.flat.carrot = \"#e67e22\";\n    Snap.flat.pumpkin = \"#d35400\";\n    Snap.flat.peterriver = \"#3498db\";\n    Snap.flat.belizehole = \"#2980b9\";\n    Snap.flat.alizarin = \"#e74c3c\";\n    Snap.flat.pomegranate = \"#c0392b\";\n    Snap.flat.amethyst = \"#9b59b6\";\n    Snap.flat.wisteria = \"#8e44ad\";\n    Snap.flat.clouds = \"#ecf0f1\";\n    Snap.flat.silver = \"#bdc3c7\";\n    Snap.flat.wetasphalt = \"#34495e\";\n    Snap.flat.midnightblue = \"#2c3e50\";\n    Snap.flat.concrete = \"#95a5a6\";\n    Snap.flat.asbestos = \"#7f8c8d\";\n    /*\\\n     * Snap.importMUIColors\n     [ method ]\n     **\n     * Imports Material UI colours into global object.\n     | Snap.importMUIColors();\n     | Snap().rect(0, 0, 10, 10).attr({fill: deeppurple, stroke: amber[600]});\n     # For colour reference: <a href=\"https://www.materialui.co\">https://www.materialui.co</a>.\n    \\*/\n    Snap.importMUIColors = function () {\n        for (var color in Snap.mui) {\n            if (Snap.mui.hasOwnProperty(color)) {\n                window[color] = Snap.mui[color];\n            }\n        }\n    };\n});\n"
  },
  {
    "path": "src/copy.js",
    "content": "// Snap.svg @VERSION\n//\n// Copyright (c) 2013 – 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// build: @DATE\n"
  },
  {
    "path": "src/element.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        Str = String,\n        unit2px = Snap._unit2px,\n        $ = Snap._.$,\n        make = Snap._.make,\n        getSomeDefs = Snap._.getSomeDefs,\n        has = \"hasOwnProperty\",\n        wrap = Snap._.wrap;\n    /*\\\n     * Element.getBBox\n     [ method ]\n     **\n     * Returns the bounding box descriptor for the given element\n     **\n     = (object) bounding box descriptor:\n     o {\n     o     cx: (number) x of the center,\n     o     cy: (number) x of the center,\n     o     h: (number) height,\n     o     height: (number) height,\n     o     path: (string) path command for the box,\n     o     r0: (number) radius of a circle that fully encloses the box,\n     o     r1: (number) radius of the smallest circle that can be enclosed,\n     o     r2: (number) radius of the largest circle that can be enclosed,\n     o     vb: (string) box as a viewbox command,\n     o     w: (number) width,\n     o     width: (number) width,\n     o     x2: (number) x of the right side,\n     o     x: (number) x of the left side,\n     o     y2: (number) y of the bottom edge,\n     o     y: (number) y of the top edge\n     o }\n    \\*/\n    elproto.getBBox = function (isWithoutTransform) {\n        if (this.type == \"tspan\") {\n            return Snap._.box(this.node.getClientRects().item(0));\n        }\n        if (!Snap.Matrix || !Snap.path) {\n            return this.node.getBBox();\n        }\n        var el = this,\n            m = new Snap.Matrix;\n        if (el.removed) {\n            return Snap._.box();\n        }\n        while (el.type == \"use\") {\n            if (!isWithoutTransform) {\n                m = m.add(el.transform().localMatrix.translate(el.attr(\"x\") || 0, el.attr(\"y\") || 0));\n            }\n            if (el.original) {\n                el = el.original;\n            } else {\n                var href = el.attr(\"xlink:href\");\n                el = el.original = el.node.ownerDocument.getElementById(href.substring(href.indexOf(\"#\") + 1));\n            }\n        }\n        var _ = el._,\n            pathfinder = Snap.path.get[el.type] || Snap.path.get.deflt;\n        try {\n            if (isWithoutTransform) {\n                _.bboxwt = pathfinder ? Snap.path.getBBox(el.realPath = pathfinder(el)) : Snap._.box(el.node.getBBox());\n                return Snap._.box(_.bboxwt);\n            } else {\n                el.realPath = pathfinder(el);\n                el.matrix = el.transform().localMatrix;\n                _.bbox = Snap.path.getBBox(Snap.path.map(el.realPath, m.add(el.matrix)));\n                return Snap._.box(_.bbox);\n            }\n        } catch (e) {\n            // Firefox doesn’t give you bbox of hidden element\n            return Snap._.box();\n        }\n    };\n    var propString = function () {\n        return this.string;\n    };\n    function extractTransform(el, tstr) {\n        if (tstr == null) {\n            var doReturn = true;\n            if (el.type == \"linearGradient\" || el.type == \"radialGradient\") {\n                tstr = el.node.getAttribute(\"gradientTransform\");\n            } else if (el.type == \"pattern\") {\n                tstr = el.node.getAttribute(\"patternTransform\");\n            } else {\n                tstr = el.node.getAttribute(\"transform\");\n            }\n            if (!tstr) {\n                return new Snap.Matrix;\n            }\n            tstr = Snap._.svgTransform2string(tstr);\n        } else {\n            if (!Snap._.rgTransform.test(tstr)) {\n                tstr = Snap._.svgTransform2string(tstr);\n            } else {\n                tstr = Str(tstr).replace(/\\.{3}|\\u2026/g, el._.transform || \"\");\n            }\n            if (is(tstr, \"array\")) {\n                tstr = Snap.path ? Snap.path.toString.call(tstr) : Str(tstr);\n            }\n            el._.transform = tstr;\n        }\n        var m = Snap._.transform2matrix(tstr, el.getBBox(1));\n        if (doReturn) {\n            return m;\n        } else {\n            el.matrix = m;\n        }\n    }\n    /*\\\n     * Element.transform\n     [ method ]\n     **\n     * Gets or sets transformation of the element\n     **\n     - tstr (string) transform string in Snap or SVG format\n     = (Element) the current element\n     * or\n     = (object) transformation descriptor:\n     o {\n     o     string (string) transform string,\n     o     globalMatrix (Matrix) matrix of all transformations applied to element or its parents,\n     o     localMatrix (Matrix) matrix of transformations applied only to the element,\n     o     diffMatrix (Matrix) matrix of difference between global and local transformations,\n     o     global (string) global transformation as string,\n     o     local (string) local transformation as string,\n     o     toString (function) returns `string` property\n     o }\n    \\*/\n    elproto.transform = function (tstr) {\n        var _ = this._;\n        if (tstr == null) {\n            var papa = this,\n                global = new Snap.Matrix(this.node.getCTM()),\n                local = extractTransform(this),\n                ms = [local],\n                m = new Snap.Matrix,\n                i,\n                localString = local.toTransformString(),\n                string = Str(local) == Str(this.matrix) ?\n                            Str(_.transform) : localString;\n            while (papa.type != \"svg\" && (papa = papa.parent())) {\n                ms.push(extractTransform(papa));\n            }\n            i = ms.length;\n            while (i--) {\n                m.add(ms[i]);\n            }\n            return {\n                string: string,\n                globalMatrix: global,\n                totalMatrix: m,\n                localMatrix: local,\n                diffMatrix: global.clone().add(local.invert()),\n                global: global.toTransformString(),\n                total: m.toTransformString(),\n                local: localString,\n                toString: propString\n            };\n        }\n        if (tstr instanceof Snap.Matrix) {\n            this.matrix = tstr;\n            this._.transform = tstr.toTransformString();\n        } else {\n            extractTransform(this, tstr);\n        }\n\n        if (this.node) {\n            if (this.type == \"linearGradient\" || this.type == \"radialGradient\") {\n                $(this.node, {gradientTransform: this.matrix});\n            } else if (this.type == \"pattern\") {\n                $(this.node, {patternTransform: this.matrix});\n            } else {\n                $(this.node, {transform: this.matrix});\n            }\n        }\n\n        return this;\n    };\n    /*\\\n     * Element.parent\n     [ method ]\n     **\n     * Returns the element's parent\n     **\n     = (Element) the parent element\n    \\*/\n    elproto.parent = function () {\n        return wrap(this.node.parentNode);\n    };\n    /*\\\n     * Element.append\n     [ method ]\n     **\n     * Appends the given element to current one\n     **\n     - el (Element|Set) element to append\n     = (Element) the parent element\n    \\*/\n    /*\\\n     * Element.add\n     [ method ]\n     **\n     * See @Element.append\n    \\*/\n    elproto.append = elproto.add = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this;\n                el.forEach(function (el) {\n                    it.add(el);\n                });\n                return this;\n            }\n            el = wrap(el);\n            this.node.appendChild(el.node);\n            el.paper = this.paper;\n        }\n        return this;\n    };\n    /*\\\n     * Element.appendTo\n     [ method ]\n     **\n     * Appends the current element to the given one\n     **\n     - el (Element) parent element to append to\n     = (Element) the child element\n    \\*/\n    elproto.appendTo = function (el) {\n        if (el) {\n            el = wrap(el);\n            el.append(this);\n        }\n        return this;\n    };\n    /*\\\n     * Element.prepend\n     [ method ]\n     **\n     * Prepends the given element to the current one\n     **\n     - el (Element) element to prepend\n     = (Element) the parent element\n    \\*/\n    elproto.prepend = function (el) {\n        if (el) {\n            if (el.type == \"set\") {\n                var it = this,\n                    first;\n                el.forEach(function (el) {\n                    if (first) {\n                        first.after(el);\n                    } else {\n                        it.prepend(el);\n                    }\n                    first = el;\n                });\n                return this;\n            }\n            el = wrap(el);\n            var parent = el.parent();\n            this.node.insertBefore(el.node, this.node.firstChild);\n            this.add && this.add();\n            el.paper = this.paper;\n            this.parent() && this.parent().add();\n            parent && parent.add();\n        }\n        return this;\n    };\n    /*\\\n     * Element.prependTo\n     [ method ]\n     **\n     * Prepends the current element to the given one\n     **\n     - el (Element) parent element to prepend to\n     = (Element) the child element\n    \\*/\n    elproto.prependTo = function (el) {\n        el = wrap(el);\n        el.prepend(this);\n        return this;\n    };\n    /*\\\n     * Element.before\n     [ method ]\n     **\n     * Inserts given element before the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.before = function (el) {\n        if (el.type == \"set\") {\n            var it = this;\n            el.forEach(function (el) {\n                var parent = el.parent();\n                it.node.parentNode.insertBefore(el.node, it.node);\n                parent && parent.add();\n            });\n            this.parent().add();\n            return this;\n        }\n        el = wrap(el);\n        var parent = el.parent();\n        this.node.parentNode.insertBefore(el.node, this.node);\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.after\n     [ method ]\n     **\n     * Inserts given element after the current one\n     **\n     - el (Element) element to insert\n     = (Element) the parent element\n    \\*/\n    elproto.after = function (el) {\n        el = wrap(el);\n        var parent = el.parent();\n        if (this.node.nextSibling) {\n            this.node.parentNode.insertBefore(el.node, this.node.nextSibling);\n        } else {\n            this.node.parentNode.appendChild(el.node);\n        }\n        this.parent() && this.parent().add();\n        parent && parent.add();\n        el.paper = this.paper;\n        return this;\n    };\n    /*\\\n     * Element.insertBefore\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertBefore = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.insertAfter\n     [ method ]\n     **\n     * Inserts the element after the given one\n     **\n     - el (Element) element next to whom insert to\n     = (Element) the parent element\n    \\*/\n    elproto.insertAfter = function (el) {\n        el = wrap(el);\n        var parent = this.parent();\n        el.node.parentNode.insertBefore(this.node, el.node.nextSibling);\n        this.paper = el.paper;\n        parent && parent.add();\n        el.parent() && el.parent().add();\n        return this;\n    };\n    /*\\\n     * Element.remove\n     [ method ]\n     **\n     * Removes element from the DOM\n     = (Element) the detached element\n    \\*/\n    elproto.remove = function () {\n        var parent = this.parent();\n        this.node.parentNode && this.node.parentNode.removeChild(this.node);\n        delete this.paper;\n        this.removed = true;\n        parent && parent.add();\n        return this;\n    };\n    /*\\\n     * Element.select\n     [ method ]\n     **\n     * Gathers the nested @Element matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Element) result of query selection\n    \\*/\n    elproto.select = function (query) {\n        return wrap(this.node.querySelector(query));\n    };\n    /*\\\n     * Element.selectAll\n     [ method ]\n     **\n     * Gathers nested @Element objects matching the given set of CSS selectors\n     **\n     - query (string) CSS selector\n     = (Set|array) result of query selection\n    \\*/\n    elproto.selectAll = function (query) {\n        var nodelist = this.node.querySelectorAll(query),\n            set = (Snap.set || Array)();\n        for (var i = 0; i < nodelist.length; i++) {\n            set.push(wrap(nodelist[i]));\n        }\n        return set;\n    };\n    /*\\\n     * Element.asPX\n     [ method ]\n     **\n     * Returns given attribute of the element as a `px` value (not %, em, etc.)\n     **\n     - attr (string) attribute name\n     - value (string) #optional attribute value\n     = (Element) result of query selection\n    \\*/\n    elproto.asPX = function (attr, value) {\n        if (value == null) {\n            value = this.attr(attr);\n        }\n        return +unit2px(this, attr, value);\n    };\n    // SIERRA Element.use(): I suggest adding a note about how to access the original element the returned <use> instantiates. It's a part of SVG with which ordinary web developers may be least familiar.\n    /*\\\n     * Element.use\n     [ method ]\n     **\n     * Creates a `<use>` element linked to the current element\n     **\n     = (Element) the `<use>` element\n    \\*/\n    elproto.use = function () {\n        var use,\n            id = this.node.id;\n        if (!id) {\n            id = this.id;\n            $(this.node, {\n                id: id\n            });\n        }\n        if (this.type == \"linearGradient\" || this.type == \"radialGradient\" ||\n            this.type == \"pattern\") {\n            use = make(this.type, this.node.parentNode);\n        } else {\n            use = make(\"use\", this.node.parentNode);\n        }\n        $(use.node, {\n            \"xlink:href\": \"#\" + id\n        });\n        use.original = this;\n        return use;\n    };\n    function fixids(el) {\n        var els = el.selectAll(\"*\"),\n            it,\n            url = /^\\s*url\\((\"|'|)(.*)\\1\\)\\s*$/,\n            ids = [],\n            uses = {};\n        function urltest(it, name) {\n            var val = $(it.node, name);\n            val = val && val.match(url);\n            val = val && val[2];\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    var attr = {};\n                    attr[name] = Snap.url(id);\n                    $(it.node, attr);\n                });\n            }\n        }\n        function linktest(it) {\n            var val = $(it.node, \"xlink:href\");\n            if (val && val.charAt() == \"#\") {\n                val = val.substring(1);\n            } else {\n                return;\n            }\n            if (val) {\n                uses[val] = (uses[val] || []).concat(function (id) {\n                    it.attr(\"xlink:href\", \"#\" + id);\n                });\n            }\n        }\n        for (var i = 0, ii = els.length; i < ii; i++) {\n            it = els[i];\n            urltest(it, \"fill\");\n            urltest(it, \"stroke\");\n            urltest(it, \"filter\");\n            urltest(it, \"mask\");\n            urltest(it, \"clip-path\");\n            linktest(it);\n            var oldid = $(it.node, \"id\");\n            if (oldid) {\n                $(it.node, {id: it.id});\n                ids.push({\n                    old: oldid,\n                    id: it.id\n                });\n            }\n        }\n        for (i = 0, ii = ids.length; i < ii; i++) {\n            var fs = uses[ids[i].old];\n            if (fs) {\n                for (var j = 0, jj = fs.length; j < jj; j++) {\n                    fs[j](ids[i].id);\n                }\n            }\n        }\n    }\n    /*\\\n     * Element.clone\n     [ method ]\n     **\n     * Creates a clone of the element and inserts it after the element\n     **\n     = (Element) the clone\n    \\*/\n    elproto.clone = function () {\n        var clone = wrap(this.node.cloneNode(true));\n        if ($(clone.node, \"id\")) {\n            $(clone.node, {id: clone.id});\n        }\n        fixids(clone);\n        clone.insertAfter(this);\n        return clone;\n    };\n    /*\\\n     * Element.toDefs\n     [ method ]\n     **\n     * Moves element to the shared `<defs>` area\n     **\n     = (Element) the element\n    \\*/\n    elproto.toDefs = function () {\n        var defs = getSomeDefs(this);\n        defs.appendChild(this.node);\n        return this;\n    };\n    /*\\\n     * Element.toPattern\n     [ method ]\n     **\n     * Creates a `<pattern>` element from the current element\n     **\n     * To create a pattern you have to specify the pattern rect:\n     - x (string|number)\n     - y (string|number)\n     - width (string|number)\n     - height (string|number)\n     = (Element) the `<pattern>` element\n     * You can use pattern later on as an argument for `fill` attribute:\n     | var p = paper.path(\"M10-5-10,15M15,0,0,15M0-5-20,15\").attr({\n     |         fill: \"none\",\n     |         stroke: \"#bada55\",\n     |         strokeWidth: 5\n     |     }).pattern(0, 0, 10, 10),\n     |     c = paper.circle(200, 200, 100);\n     | c.attr({\n     |     fill: p\n     | });\n    \\*/\n    elproto.pattern = elproto.toPattern = function (x, y, width, height) {\n        var p = make(\"pattern\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        $(p.node, {\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            patternUnits: \"userSpaceOnUse\",\n            id: p.id,\n            viewBox: [x, y, width, height].join(\" \")\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n// SIERRA Element.marker(): clarify what a reference point is. E.g., helps you offset the object from its edge such as when centering it over a path.\n// SIERRA Element.marker(): I suggest the method should accept default reference point values.  Perhaps centered with (refX = width/2) and (refY = height/2)? Also, couldn't it assume the element's current _width_ and _height_? And please specify what _x_ and _y_ mean: offsets? If so, from where?  Couldn't they also be assigned default values?\n    /*\\\n     * Element.marker\n     [ method ]\n     **\n     * Creates a `<marker>` element from the current element\n     **\n     * To create a marker you have to specify the bounding rect and reference point:\n     - x (number)\n     - y (number)\n     - width (number)\n     - height (number)\n     - refX (number)\n     - refY (number)\n     = (Element) the `<marker>` element\n     * You can specify the marker later as an argument for `marker-start`, `marker-end`, `marker-mid`, and `marker` attributes. The `marker` attribute places the marker at every point along the path, and `marker-mid` places them at every point except the start and end.\n    \\*/\n    // TODO add usage for markers\n    elproto.marker = function (x, y, width, height, refX, refY) {\n        var p = make(\"marker\", getSomeDefs(this));\n        if (x == null) {\n            x = this.getBBox();\n        }\n        if (is(x, \"object\") && \"x\" in x) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            refX = x.refX || x.cx;\n            refY = x.refY || x.cy;\n            x = x.x;\n        }\n        $(p.node, {\n            viewBox: [x, y, width, height].join(\" \"),\n            markerWidth: width,\n            markerHeight: height,\n            orient: \"auto\",\n            refX: refX || 0,\n            refY: refY || 0,\n            id: p.id\n        });\n        p.node.appendChild(this.node);\n        return p;\n    };\n    var eldata = {};\n    /*\\\n     * Element.data\n     [ method ]\n     **\n     * Adds or retrieves given value associated with given key. (Don’t confuse\n     * with `data-` attributes)\n     *\n     * See also @Element.removeData\n     - key (string) key to store data\n     - value (any) #optional value to store\n     = (object) @Element\n     * or, if value is not specified:\n     = (any) value\n     > Usage\n     | for (var i = 0, i < 5, i++) {\n     |     paper.circle(10 + 15 * i, 10, 10)\n     |          .attr({fill: \"#000\"})\n     |          .data(\"i\", i)\n     |          .click(function () {\n     |             alert(this.data(\"i\"));\n     |          });\n     | }\n    \\*/\n    elproto.data = function (key, value) {\n        var data = eldata[this.id] = eldata[this.id] || {};\n        if (arguments.length == 0){\n            eve(\"snap.data.get.\" + this.id, this, data, null);\n            return data;\n        }\n        if (arguments.length == 1) {\n            if (Snap.is(key, \"object\")) {\n                for (var i in key) if (key[has](i)) {\n                    this.data(i, key[i]);\n                }\n                return this;\n            }\n            eve(\"snap.data.get.\" + this.id, this, data[key], key);\n            return data[key];\n        }\n        data[key] = value;\n        eve(\"snap.data.set.\" + this.id, this, value, key);\n        return this;\n    };\n    /*\\\n     * Element.removeData\n     [ method ]\n     **\n     * Removes value associated with an element by given key.\n     * If key is not provided, removes all the data of the element.\n     - key (string) #optional key\n     = (object) @Element\n    \\*/\n    elproto.removeData = function (key) {\n        if (key == null) {\n            eldata[this.id] = {};\n        } else {\n            eldata[this.id] && delete eldata[this.id][key];\n        }\n        return this;\n    };\n    /*\\\n     * Element.outerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element, equivalent to HTML's `outerHTML`.\n     *\n     * See also @Element.innerSVG\n     = (string) SVG code for the element\n    \\*/\n    /*\\\n     * Element.toString\n     [ method ]\n     **\n     * See @Element.outerSVG\n    \\*/\n    elproto.outerSVG = elproto.toString = toString(1);\n    /*\\\n     * Element.innerSVG\n     [ method ]\n     **\n     * Returns SVG code for the element's contents, equivalent to HTML's `innerHTML`\n     = (string) SVG code for the element\n    \\*/\n    elproto.innerSVG = toString();\n    function toString(type) {\n        return function () {\n            var res = type ? \"<\" + this.type : \"\",\n                attr = this.node.attributes,\n                chld = this.node.childNodes;\n            if (type) {\n                for (var i = 0, ii = attr.length; i < ii; i++) {\n                    res += \" \" + attr[i].name + '=\"' +\n                            attr[i].value.replace(/\"/g, '\\\\\"') + '\"';\n                }\n            }\n            if (chld.length) {\n                type && (res += \">\");\n                for (i = 0, ii = chld.length; i < ii; i++) {\n                    if (chld[i].nodeType == 3) {\n                        res += chld[i].nodeValue;\n                    } else if (chld[i].nodeType == 1) {\n                        res += wrap(chld[i]).toString();\n                    }\n                }\n                type && (res += \"</\" + this.type + \">\");\n            } else {\n                type && (res += \"/>\");\n            }\n            return res;\n        };\n    }\n    elproto.toDataURL = function () {\n        if (window && window.btoa) {\n            var bb = this.getBBox(),\n                svg = Snap.format('<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"{width}\" height=\"{height}\" viewBox=\"{x} {y} {width} {height}\">{contents}</svg>', {\n                x: +bb.x.toFixed(3),\n                y: +bb.y.toFixed(3),\n                width: +bb.width.toFixed(3),\n                height: +bb.height.toFixed(3),\n                contents: this.outerSVG()\n            });\n            return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(svg)));\n        }\n    };\n    /*\\\n     * Fragment.select\n     [ method ]\n     **\n     * See @Element.select\n    \\*/\n    Fragment.prototype.select = elproto.select;\n    /*\\\n     * Fragment.selectAll\n     [ method ]\n     **\n     * See @Element.selectAll\n    \\*/\n    Fragment.prototype.selectAll = elproto.selectAll;\n});\n"
  },
  {
    "path": "src/equal.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var names = {},\n        reUnit = /[%a-z]+$/i,\n        Str = String;\n    names.stroke = names.fill = \"colour\";\n    function getEmpty(item) {\n        var l = item[0];\n        switch (l.toLowerCase()) {\n            case \"t\": return [l, 0, 0];\n            case \"m\": return [l, 1, 0, 0, 1, 0, 0];\n            case \"r\": if (item.length == 4) {\n                return [l, 0, item[2], item[3]];\n            } else {\n                return [l, 0];\n            }\n            case \"s\": if (item.length == 5) {\n                return [l, 1, 1, item[3], item[4]];\n            } else if (item.length == 3) {\n                return [l, 1, 1];\n            } else {\n                return [l, 1];\n            }\n        }\n    }\n    function equaliseTransform(t1, t2, getBBox) {\n        t1 = t1 || new Snap.Matrix;\n        t2 = t2 || new Snap.Matrix;\n        t1 = Snap.parseTransformString(t1.toTransformString()) || [];\n        t2 = Snap.parseTransformString(t2.toTransformString()) || [];\n        var maxlength = Math.max(t1.length, t2.length),\n            from = [],\n            to = [],\n            i = 0, j, jj,\n            tt1, tt2;\n        for (; i < maxlength; i++) {\n            tt1 = t1[i] || getEmpty(t2[i]);\n            tt2 = t2[i] || getEmpty(tt1);\n            if (tt1[0] != tt2[0] ||\n                tt1[0].toLowerCase() == \"r\" && (tt1[2] != tt2[2] || tt1[3] != tt2[3]) ||\n                tt1[0].toLowerCase() == \"s\" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])\n                ) {\n                    t1 = Snap._.transform2matrix(t1, getBBox());\n                    t2 = Snap._.transform2matrix(t2, getBBox());\n                    from = [[\"m\", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f]];\n                    to = [[\"m\", t2.a, t2.b, t2.c, t2.d, t2.e, t2.f]];\n                    break;\n            }\n            from[i] = [];\n            to[i] = [];\n            for (j = 0, jj = Math.max(tt1.length, tt2.length); j < jj; j++) {\n                j in tt1 && (from[i][j] = tt1[j]);\n                j in tt2 && (to[i][j] = tt2[j]);\n            }\n        }\n        return {\n            from: path2array(from),\n            to: path2array(to),\n            f: getPath(from)\n        };\n    }\n    function getNumber(val) {\n        return val;\n    }\n    function getUnit(unit) {\n        return function (val) {\n            return +val.toFixed(3) + unit;\n        };\n    }\n    function getViewBox(val) {\n        return val.join(\" \");\n    }\n    function getColour(clr) {\n        return Snap.rgb(clr[0], clr[1], clr[2], clr[3]);\n    }\n    function getPath(path) {\n        var k = 0, i, ii, j, jj, out, a, b = [];\n        for (i = 0, ii = path.length; i < ii; i++) {\n            out = \"[\";\n            a = ['\"' + path[i][0] + '\"'];\n            for (j = 1, jj = path[i].length; j < jj; j++) {\n                a[j] = \"val[\" + k++ + \"]\";\n            }\n            out += a + \"]\";\n            b[i] = out;\n        }\n        return Function(\"val\", \"return Snap.path.toString.call([\" + b + \"])\");\n    }\n    function path2array(path) {\n        var out = [];\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            for (var j = 1, jj = path[i].length; j < jj; j++) {\n                out.push(path[i][j]);\n            }\n        }\n        return out;\n    }\n    function isNumeric(obj) {\n        return isFinite(obj);\n    }\n    function arrayEqual(arr1, arr2) {\n        if (!Snap.is(arr1, \"array\") || !Snap.is(arr2, \"array\")) {\n            return false;\n        }\n        return arr1.toString() == arr2.toString();\n    }\n    Element.prototype.equal = function (name, b) {\n        return eve(\"snap.util.equal\", this, name, b).firstDefined();\n    };\n    eve.on(\"snap.util.equal\", function (name, b) {\n        var A, B, a = Str(this.attr(name) || \"\"),\n            el = this;\n        if (names[name] == \"colour\") {\n            A = Snap.color(a);\n            B = Snap.color(b);\n            return {\n                from: [A.r, A.g, A.b, A.opacity],\n                to: [B.r, B.g, B.b, B.opacity],\n                f: getColour\n            };\n        }\n        if (name == \"viewBox\") {\n            A = this.attr(name).vb.split(\" \").map(Number);\n            B = b.split(\" \").map(Number);\n            return {\n                from: A,\n                to: B,\n                f: getViewBox\n            };\n        }\n        if (name == \"transform\" || name == \"gradientTransform\" || name == \"patternTransform\") {\n            if (typeof b == \"string\") {\n                b = Str(b).replace(/\\.{3}|\\u2026/g, a);\n            }\n            a = this.matrix;\n            if (!Snap._.rgTransform.test(b)) {\n                b = Snap._.transform2matrix(Snap._.svgTransform2string(b), this.getBBox());\n            } else {\n                b = Snap._.transform2matrix(b, this.getBBox());\n            }\n            return equaliseTransform(a, b, function () {\n                return el.getBBox(1);\n            });\n        }\n        if (name == \"d\" || name == \"path\") {\n            A = Snap.path.toCubic(a, b);\n            return {\n                from: path2array(A[0]),\n                to: path2array(A[1]),\n                f: getPath(A[0])\n            };\n        }\n        if (name == \"points\") {\n            A = Str(a).split(Snap._.separator);\n            B = Str(b).split(Snap._.separator);\n            return {\n                from: A,\n                to: B,\n                f: function (val) { return val; }\n            };\n        }\n        if (isNumeric(a) && isNumeric(b)) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getNumber\n            };\n        }\n        var aUnit = a.match(reUnit),\n            bUnit = Str(b).match(reUnit);\n        if (aUnit && arrayEqual(aUnit, bUnit)) {\n            return {\n                from: parseFloat(a),\n                to: parseFloat(b),\n                f: getUnit(aUnit)\n            };\n        } else {\n            return {\n                from: this.asPX(name),\n                to: this.asPX(name, b),\n                f: getNumber\n            };\n        }\n    });\n});\n"
  },
  {
    "path": "src/filter.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        pproto = Paper.prototype,\n        rgurl = /^\\s*url\\((.+)\\)/,\n        Str = String,\n        $ = Snap._.$;\n    Snap.filter = {};\n    /*\\\n     * Paper.filter\n     [ method ]\n     **\n     * Creates a `<filter>` element\n     **\n     - filstr (string) SVG fragment of filter provided as a string\n     = (object) @Element\n     * Note: It is recommended to use filters embedded into the page inside an empty SVG element.\n     > Usage\n     | var f = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>'),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    pproto.filter = function (filstr) {\n        var paper = this;\n        if (paper.type != \"svg\") {\n            paper = paper.paper;\n        }\n        var f = Snap.parse(Str(filstr)),\n            id = Snap._.id(),\n            width = paper.node.offsetWidth,\n            height = paper.node.offsetHeight,\n            filter = $(\"filter\");\n        $(filter, {\n            id: id,\n            filterUnits: \"userSpaceOnUse\"\n        });\n        filter.appendChild(f.node);\n        paper.defs.appendChild(filter);\n        return new Element(filter);\n    };\n\n    eve.on(\"snap.util.getattr.filter\", function () {\n        eve.stop();\n        var p = $(this.node, \"filter\");\n        if (p) {\n            var match = Str(p).match(rgurl);\n            return match && Snap.select(match[1]);\n        }\n    });\n    eve.on(\"snap.util.attr.filter\", function (value) {\n        if (value instanceof Element && value.type == \"filter\") {\n            eve.stop();\n            var id = value.node.id;\n            if (!id) {\n                $(value.node, {id: value.id});\n                id = value.id;\n            }\n            $(this.node, {\n                filter: Snap.url(id)\n            });\n        }\n        if (!value || value == \"none\") {\n            eve.stop();\n            this.node.removeAttribute(\"filter\");\n        }\n    });\n    /*\\\n     * Snap.filter.blur\n     [ method ]\n     **\n     * Returns an SVG markup string for the blur filter\n     **\n     - x (number) amount of horizontal blur, in pixels\n     - y (number) #optional amount of vertical blur, in pixels\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.blur(5, 10)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.blur = function (x, y) {\n        if (x == null) {\n            x = 2;\n        }\n        var def = y == null ? x : [x, y];\n        return Snap.format('\\<feGaussianBlur stdDeviation=\"{def}\"/>', {\n            def: def\n        });\n    };\n    Snap.filter.blur.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.shadow\n     [ method ]\n     **\n     * Returns an SVG markup string for the shadow filter\n     **\n     - dx (number) #optional horizontal shift of the shadow, in pixels\n     - dy (number) #optional vertical shift of the shadow, in pixels\n     - blur (number) #optional amount of blur\n     - color (string) #optional color of the shadow\n     - opacity (number) #optional `0..1` opacity of the shadow\n     * or\n     - dx (number) #optional horizontal shift of the shadow, in pixels\n     - dy (number) #optional vertical shift of the shadow, in pixels\n     - color (string) #optional color of the shadow\n     - opacity (number) #optional `0..1` opacity of the shadow\n     * which makes blur default to `4`. Or\n     - dx (number) #optional horizontal shift of the shadow, in pixels\n     - dy (number) #optional vertical shift of the shadow, in pixels\n     - opacity (number) #optional `0..1` opacity of the shadow\n     = (string) filter representation\n     > Usage\n     | var f = paper.filter(Snap.filter.shadow(0, 2, .3)),\n     |     c = paper.circle(10, 10, 10).attr({\n     |         filter: f\n     |     });\n    \\*/\n    Snap.filter.shadow = function (dx, dy, blur, color, opacity) {\n        if (opacity == null) {\n            if (color == null) {\n                opacity = blur;\n                blur = 4;\n                color = \"#000\";\n            } else {\n                opacity = color;\n                color = blur;\n                blur = 4;\n            }\n        }\n        if (blur == null) {\n            blur = 4;\n        }\n        if (opacity == null) {\n            opacity = 1;\n        }\n        if (dx == null) {\n            dx = 0;\n            dy = 2;\n        }\n        if (dy == null) {\n            dy = dx;\n        }\n        color = Snap.color(color);\n        return Snap.format('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"{blur}\"/><feOffset dx=\"{dx}\" dy=\"{dy}\" result=\"offsetblur\"/><feFlood flood-color=\"{color}\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"{opacity}\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>', {\n            color: color,\n            dx: dx,\n            dy: dy,\n            blur: blur,\n            opacity: opacity\n        });\n    };\n    Snap.filter.shadow.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.grayscale\n     [ method ]\n     **\n     * Returns an SVG markup string for the grayscale filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.grayscale = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {b} {h} 0 0 0 0 0 1 0\"/>', {\n            a: 0.2126 + 0.7874 * (1 - amount),\n            b: 0.7152 - 0.7152 * (1 - amount),\n            c: 0.0722 - 0.0722 * (1 - amount),\n            d: 0.2126 - 0.2126 * (1 - amount),\n            e: 0.7152 + 0.2848 * (1 - amount),\n            f: 0.0722 - 0.0722 * (1 - amount),\n            g: 0.2126 - 0.2126 * (1 - amount),\n            h: 0.0722 + 0.9278 * (1 - amount)\n        });\n    };\n    Snap.filter.grayscale.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.sepia\n     [ method ]\n     **\n     * Returns an SVG markup string for the sepia filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.sepia = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"matrix\" values=\"{a} {b} {c} 0 0 {d} {e} {f} 0 0 {g} {h} {i} 0 0 0 0 0 1 0\"/>', {\n            a: 0.393 + 0.607 * (1 - amount),\n            b: 0.769 - 0.769 * (1 - amount),\n            c: 0.189 - 0.189 * (1 - amount),\n            d: 0.349 - 0.349 * (1 - amount),\n            e: 0.686 + 0.314 * (1 - amount),\n            f: 0.168 - 0.168 * (1 - amount),\n            g: 0.272 - 0.272 * (1 - amount),\n            h: 0.534 - 0.534 * (1 - amount),\n            i: 0.131 + 0.869 * (1 - amount)\n        });\n    };\n    Snap.filter.sepia.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.saturate\n     [ method ]\n     **\n     * Returns an SVG markup string for the saturate filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.saturate = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feColorMatrix type=\"saturate\" values=\"{amount}\"/>', {\n            amount: 1 - amount\n        });\n    };\n    Snap.filter.saturate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.hueRotate\n     [ method ]\n     **\n     * Returns an SVG markup string for the hue-rotate filter\n     **\n     - angle (number) angle of rotation\n     = (string) filter representation\n    \\*/\n    Snap.filter.hueRotate = function (angle) {\n        angle = angle || 0;\n        return Snap.format('<feColorMatrix type=\"hueRotate\" values=\"{angle}\"/>', {\n            angle: angle\n        });\n    };\n    Snap.filter.hueRotate.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.invert\n     [ method ]\n     **\n     * Returns an SVG markup string for the invert filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.invert = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n//        <feColorMatrix type=\"matrix\" values=\"-1 0 0 0 1  0 -1 0 0 1  0 0 -1 0 1  0 0 0 1 0\" color-interpolation-filters=\"sRGB\"/>\n        return Snap.format('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncG type=\"table\" tableValues=\"{amount} {amount2}\"/><feFuncB type=\"table\" tableValues=\"{amount} {amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: 1 - amount\n        });\n    };\n    Snap.filter.invert.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.brightness\n     [ method ]\n     **\n     * Returns an SVG markup string for the brightness filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.brightness = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\"/><feFuncG type=\"linear\" slope=\"{amount}\"/><feFuncB type=\"linear\" slope=\"{amount}\"/></feComponentTransfer>', {\n            amount: amount\n        });\n    };\n    Snap.filter.brightness.toString = function () {\n        return this();\n    };\n    /*\\\n     * Snap.filter.contrast\n     [ method ]\n     **\n     * Returns an SVG markup string for the contrast filter\n     **\n     - amount (number) amount of filter (`0..1`)\n     = (string) filter representation\n    \\*/\n    Snap.filter.contrast = function (amount) {\n        if (amount == null) {\n            amount = 1;\n        }\n        return Snap.format('<feComponentTransfer><feFuncR type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncG type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/><feFuncB type=\"linear\" slope=\"{amount}\" intercept=\"{amount2}\"/></feComponentTransfer>', {\n            amount: amount,\n            amount2: .5 - amount / 2\n        });\n    };\n    Snap.filter.contrast.toString = function () {\n        return this();\n    };\n});\n"
  },
  {
    "path": "src/matrix.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var objectToString = Object.prototype.toString,\n        Str = String,\n        math = Math,\n        E = \"\";\n    function Matrix(a, b, c, d, e, f) {\n        if (b == null && objectToString.call(a) == \"[object SVGMatrix]\") {\n            this.a = a.a;\n            this.b = a.b;\n            this.c = a.c;\n            this.d = a.d;\n            this.e = a.e;\n            this.f = a.f;\n            return;\n        }\n        if (a != null) {\n            this.a = +a;\n            this.b = +b;\n            this.c = +c;\n            this.d = +d;\n            this.e = +e;\n            this.f = +f;\n        } else {\n            this.a = 1;\n            this.b = 0;\n            this.c = 0;\n            this.d = 1;\n            this.e = 0;\n            this.f = 0;\n        }\n    }\n    (function (matrixproto) {\n        /*\\\n         * Matrix.add\n         [ method ]\n         **\n         * Adds the given matrix to existing one\n         - a (number)\n         - b (number)\n         - c (number)\n         - d (number)\n         - e (number)\n         - f (number)\n         * or\n         - matrix (object) @Matrix\n        \\*/\n        matrixproto.add = function (a, b, c, d, e, f) {\n            if (a && a instanceof Matrix) {\n                return this.add(a.a, a.b, a.c, a.d, a.e, a.f);\n            }\n            var aNew = a * this.a + b * this.c,\n                bNew = a * this.b + b * this.d;\n            this.e += e * this.a + f * this.c;\n            this.f += e * this.b + f * this.d;\n            this.c = c * this.a + d * this.c;\n            this.d = c * this.b + d * this.d;\n\n            this.a = aNew;\n            this.b = bNew;\n            return this;\n        };\n        /*\\\n         * Matrix.multLeft\n         [ method ]\n         **\n         * Multiplies a passed affine transform to the left: M * this.\n         - a (number)\n         - b (number)\n         - c (number)\n         - d (number)\n         - e (number)\n         - f (number)\n         * or\n         - matrix (object) @Matrix\n        \\*/\n        Matrix.prototype.multLeft = function (a, b, c, d, e, f) {\n            if (a && a instanceof Matrix) {\n                return this.multLeft(a.a, a.b, a.c, a.d, a.e, a.f);\n            }\n            var aNew = a * this.a + c * this.b,\n                cNew = a * this.c + c * this.d,\n                eNew = a * this.e + c * this.f + e;\n            this.b = b * this.a + d * this.b;\n            this.d = b * this.c + d * this.d;\n            this.f = b * this.e + d * this.f + f;\n\n            this.a = aNew;\n            this.c = cNew;\n            this.e = eNew;\n            return this;\n        };\n        /*\\\n         * Matrix.invert\n         [ method ]\n         **\n         * Returns an inverted version of the matrix\n         = (object) @Matrix\n        \\*/\n        matrixproto.invert = function () {\n            var me = this,\n                x = me.a * me.d - me.b * me.c;\n            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);\n        };\n        /*\\\n         * Matrix.clone\n         [ method ]\n         **\n         * Returns a copy of the matrix\n         = (object) @Matrix\n        \\*/\n        matrixproto.clone = function () {\n            return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n        };\n        /*\\\n         * Matrix.translate\n         [ method ]\n         **\n         * Translate the matrix\n         - x (number) horizontal offset distance\n         - y (number) vertical offset distance\n        \\*/\n        matrixproto.translate = function (x, y) {\n            this.e += x * this.a + y * this.c;\n            this.f += x * this.b + y * this.d;\n            return this;\n        };\n        /*\\\n         * Matrix.scale\n         [ method ]\n         **\n         * Scales the matrix\n         - x (number) amount to be scaled, with `1` resulting in no change\n         - y (number) #optional amount to scale along the vertical axis. (Otherwise `x` applies to both axes.)\n         - cx (number) #optional horizontal origin point from which to scale\n         - cy (number) #optional vertical origin point from which to scale\n         * Default cx, cy is the middle point of the element.\n        \\*/\n        matrixproto.scale = function (x, y, cx, cy) {\n            y == null && (y = x);\n            (cx || cy) && this.translate(cx, cy);\n            this.a *= x;\n            this.b *= x;\n            this.c *= y;\n            this.d *= y;\n            (cx || cy) && this.translate(-cx, -cy);\n            return this;\n        };\n        /*\\\n         * Matrix.rotate\n         [ method ]\n         **\n         * Rotates the matrix\n         - a (number) angle of rotation, in degrees\n         - x (number) horizontal origin point from which to rotate\n         - y (number) vertical origin point from which to rotate\n        \\*/\n        matrixproto.rotate = function (a, x, y) {\n            a = Snap.rad(a);\n            x = x || 0;\n            y = y || 0;\n            var cos = +math.cos(a).toFixed(9),\n                sin = +math.sin(a).toFixed(9);\n            this.add(cos, sin, -sin, cos, x, y);\n            return this.add(1, 0, 0, 1, -x, -y);\n        };\n        /*\\\n         * Matrix.skewX\n         [ method ]\n         **\n         * Skews the matrix along the x-axis\n         - x (number) Angle to skew along the x-axis (in degrees).\n        \\*/\n        matrixproto.skewX = function (x) {\n            return this.skew(x, 0);\n        };\n        /*\\\n         * Matrix.skewY\n         [ method ]\n         **\n         * Skews the matrix along the y-axis\n         - y (number) Angle to skew along the y-axis (in degrees).\n        \\*/\n        matrixproto.skewY = function (y) {\n            return this.skew(0, y);\n        };\n        /*\\\n         * Matrix.skew\n         [ method ]\n         **\n         * Skews the matrix\n         - y (number) Angle to skew along the y-axis (in degrees).\n         - x (number) Angle to skew along the x-axis (in degrees).\n        \\*/\n        matrixproto.skew = function (x, y) {\n            x = x || 0;\n            y = y || 0;\n            x = Snap.rad(x);\n            y = Snap.rad(y);\n            var c = math.tan(x).toFixed(9);\n            var b = math.tan(y).toFixed(9);\n            return this.add(1, b, c, 1, 0, 0);\n        };\n        /*\\\n         * Matrix.x\n         [ method ]\n         **\n         * Returns x coordinate for given point after transformation described by the matrix. See also @Matrix.y\n         - x (number)\n         - y (number)\n         = (number) x\n        \\*/\n        matrixproto.x = function (x, y) {\n            return x * this.a + y * this.c + this.e;\n        };\n        /*\\\n         * Matrix.y\n         [ method ]\n         **\n         * Returns y coordinate for given point after transformation described by the matrix. See also @Matrix.x\n         - x (number)\n         - y (number)\n         = (number) y\n        \\*/\n        matrixproto.y = function (x, y) {\n            return x * this.b + y * this.d + this.f;\n        };\n        matrixproto.get = function (i) {\n            return +this[Str.fromCharCode(97 + i)].toFixed(4);\n        };\n        matrixproto.toString = function () {\n            return \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\";\n        };\n        matrixproto.offset = function () {\n            return [this.e.toFixed(4), this.f.toFixed(4)];\n        };\n        function norm(a) {\n            return a[0] * a[0] + a[1] * a[1];\n        }\n        function normalize(a) {\n            var mag = math.sqrt(norm(a));\n            a[0] && (a[0] /= mag);\n            a[1] && (a[1] /= mag);\n        }\n        /*\\\n         * Matrix.determinant\n         [ method ]\n         **\n         * Finds determinant of the given matrix.\n         = (number) determinant\n        \\*/\n        matrixproto.determinant = function () {\n            return this.a * this.d - this.b * this.c;\n        };\n        /*\\\n         * Matrix.split\n         [ method ]\n         **\n         * Splits matrix into primitive transformations\n         = (object) in format:\n         o dx (number) translation by x\n         o dy (number) translation by y\n         o scalex (number) scale by x\n         o scaley (number) scale by y\n         o shear (number) shear\n         o rotate (number) rotation in deg\n         o isSimple (boolean) could it be represented via simple transformations\n        \\*/\n        matrixproto.split = function () {\n            var out = {};\n            // translation\n            out.dx = this.e;\n            out.dy = this.f;\n\n            // scale and shear\n            var row = [[this.a, this.b], [this.c, this.d]];\n            out.scalex = math.sqrt(norm(row[0]));\n            normalize(row[0]);\n\n            out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];\n            row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];\n\n            out.scaley = math.sqrt(norm(row[1]));\n            normalize(row[1]);\n            out.shear /= out.scaley;\n\n            if (this.determinant() < 0) {\n                out.scalex = -out.scalex;\n            }\n\n            // rotation\n            var sin = row[0][1],\n                cos = row[1][1];\n            if (cos < 0) {\n                out.rotate = Snap.deg(math.acos(cos));\n                if (sin < 0) {\n                    out.rotate = 360 - out.rotate;\n                }\n            } else {\n                out.rotate = Snap.deg(math.asin(sin));\n            }\n\n            out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);\n            out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;\n            out.noRotation = !+out.shear.toFixed(9) && !out.rotate;\n            return out;\n        };\n        /*\\\n         * Matrix.toTransformString\n         [ method ]\n         **\n         * Returns transform string that represents given matrix\n         = (string) transform string\n        \\*/\n        matrixproto.toTransformString = function (shorter) {\n            var s = shorter || this.split();\n            if (!+s.shear.toFixed(9)) {\n                s.scalex = +s.scalex.toFixed(4);\n                s.scaley = +s.scaley.toFixed(4);\n                s.rotate = +s.rotate.toFixed(4);\n                return  (s.dx || s.dy ? \"t\" + [+s.dx.toFixed(4), +s.dy.toFixed(4)] : E) +\n                        (s.rotate ? \"r\" + [+s.rotate.toFixed(4), 0, 0] : E) +\n                        (s.scalex != 1 || s.scaley != 1 ? \"s\" + [s.scalex, s.scaley, 0, 0] : E);\n            } else {\n                return \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];\n            }\n        };\n    })(Matrix.prototype);\n    /*\\\n     * Snap.Matrix\n     [ method ]\n     **\n     * Matrix constructor, extend on your own risk.\n     * To create matrices use @Snap.matrix.\n    \\*/\n    Snap.Matrix = Matrix;\n    /*\\\n     * Snap.matrix\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns a matrix based on the given parameters\n     - a (number)\n     - b (number)\n     - c (number)\n     - d (number)\n     - e (number)\n     - f (number)\n     * or\n     - svgMatrix (SVGMatrix)\n     = (object) @Matrix\n    \\*/\n    Snap.matrix = function (a, b, c, d, e, f) {\n        return new Matrix(a, b, c, d, e, f);\n    };\n});\n"
  },
  {
    "path": "src/mina.js",
    "content": "// Copyright (c) 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nvar mina = (function (eve) {\n    var animations = {},\n    requestAnimFrame = window.requestAnimationFrame       ||\n                       window.webkitRequestAnimationFrame ||\n                       window.mozRequestAnimationFrame    ||\n                       window.oRequestAnimationFrame      ||\n                       window.msRequestAnimationFrame     ||\n                       function (callback) {\n                           setTimeout(callback, 16, new Date().getTime());\n                           return true;\n                       },\n    requestID,\n    isArray = Array.isArray || function (a) {\n        return a instanceof Array ||\n            Object.prototype.toString.call(a) == \"[object Array]\";\n    },\n    idgen = 0,\n    idprefix = \"M\" + (+new Date).toString(36),\n    ID = function () {\n        return idprefix + (idgen++).toString(36);\n    },\n    diff = function (a, b, A, B) {\n        if (isArray(a)) {\n            res = [];\n            for (var i = 0, ii = a.length; i < ii; i++) {\n                res[i] = diff(a[i], b, A[i], B);\n            }\n            return res;\n        }\n        var dif = (A - a) / (B - b);\n        return function (bb) {\n            return a + dif * (bb - b);\n        };\n    },\n    timer = Date.now || function () {\n        return +new Date;\n    },\n    sta = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.s;\n        }\n        var ds = a.s - val;\n        a.b += a.dur * ds;\n        a.B += a.dur * ds;\n        a.s = val;\n    },\n    speed = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.spd;\n        }\n        a.spd = val;\n    },\n    duration = function (val) {\n        var a = this;\n        if (val == null) {\n            return a.dur;\n        }\n        a.s = a.s * val / a.dur;\n        a.dur = val;\n    },\n    stopit = function () {\n        var a = this;\n        delete animations[a.id];\n        a.update();\n        eve(\"mina.stop.\" + a.id, a);\n    },\n    pause = function () {\n        var a = this;\n        if (a.pdif) {\n            return;\n        }\n        delete animations[a.id];\n        a.update();\n        a.pdif = a.get() - a.b;\n    },\n    resume = function () {\n        var a = this;\n        if (!a.pdif) {\n            return;\n        }\n        a.b = a.get() - a.pdif;\n        delete a.pdif;\n        animations[a.id] = a;\n        frame();\n    },\n    update = function () {\n        var a = this,\n            res;\n        if (isArray(a.start)) {\n            res = [];\n            for (var j = 0, jj = a.start.length; j < jj; j++) {\n                res[j] = +a.start[j] +\n                    (a.end[j] - a.start[j]) * a.easing(a.s);\n            }\n        } else {\n            res = +a.start + (a.end - a.start) * a.easing(a.s);\n        }\n        a.set(res);\n    },\n    frame = function (timeStamp) {\n        // Manual invokation?\n        if (!timeStamp) {\n            // Frame loop stopped?\n            if (!requestID) {\n                // Start frame loop...\n                requestID = requestAnimFrame(frame);\n            }\n            return;\n        }\n        var len = 0;\n        for (var i in animations) if (animations.hasOwnProperty(i)) {\n            var a = animations[i],\n                b = a.get(),\n                res;\n            len++;\n            a.s = (b - a.b) / (a.dur / a.spd);\n            if (a.s >= 1) {\n                delete animations[i];\n                a.s = 1;\n                len--;\n                (function (a) {\n                    setTimeout(function () {\n                        eve(\"mina.finish.\" + a.id, a);\n                    });\n                }(a));\n            }\n            a.update();\n        }\n        requestID = len ? requestAnimFrame(frame) : false;\n    },\n    /*\\\n     * mina\n     [ method ]\n     **\n     * Generic animation of numbers\n     **\n     - a (number) start _slave_ number\n     - A (number) end _slave_ number\n     - b (number) start _master_ number (start time in general case)\n     - B (number) end _master_ number (end time in general case)\n     - get (function) getter of _master_ number (see @mina.time)\n     - set (function) setter of _slave_ number\n     - easing (function) #optional easing function, default is @mina.linear\n     = (object) animation descriptor\n     o {\n     o         id (string) animation id,\n     o         start (number) start _slave_ number,\n     o         end (number) end _slave_ number,\n     o         b (number) start _master_ number,\n     o         s (number) animation status (0..1),\n     o         dur (number) animation duration,\n     o         spd (number) animation speed,\n     o         get (function) getter of _master_ number (see @mina.time),\n     o         set (function) setter of _slave_ number,\n     o         easing (function) easing function, default is @mina.linear,\n     o         status (function) status getter/setter,\n     o         speed (function) speed getter/setter,\n     o         duration (function) duration getter/setter,\n     o         stop (function) animation stopper\n     o         pause (function) pauses the animation\n     o         resume (function) resumes the animation\n     o         update (function) calles setter with the right value of the animation\n     o }\n    \\*/\n    mina = function (a, A, b, B, get, set, easing) {\n        var anim = {\n            id: ID(),\n            start: a,\n            end: A,\n            b: b,\n            s: 0,\n            dur: B - b,\n            spd: 1,\n            get: get,\n            set: set,\n            easing: easing || mina.linear,\n            status: sta,\n            speed: speed,\n            duration: duration,\n            stop: stopit,\n            pause: pause,\n            resume: resume,\n            update: update\n        };\n        animations[anim.id] = anim;\n        var len = 0, i;\n        for (i in animations) if (animations.hasOwnProperty(i)) {\n            len++;\n            if (len == 2) {\n                break;\n            }\n        }\n        len == 1 && frame();\n        return anim;\n    };\n    /*\\\n     * mina.time\n     [ method ]\n     **\n     * Returns the current time. Equivalent to:\n     | function () {\n     |     return (new Date).getTime();\n     | }\n    \\*/\n    mina.time = timer;\n    /*\\\n     * mina.getById\n     [ method ]\n     **\n     * Returns an animation by its id\n     - id (string) animation's id\n     = (object) See @mina\n    \\*/\n    mina.getById = function (id) {\n        return animations[id] || null;\n    };\n\n    /*\\\n     * mina.linear\n     [ method ]\n     **\n     * Default linear easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.linear = function (n) {\n        return n;\n    };\n    /*\\\n     * mina.easeout\n     [ method ]\n     **\n     * Easeout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeout = function (n) {\n        return Math.pow(n, 1.7);\n    };\n    /*\\\n     * mina.easein\n     [ method ]\n     **\n     * Easein easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easein = function (n) {\n        return Math.pow(n, .48);\n    };\n    /*\\\n     * mina.easeinout\n     [ method ]\n     **\n     * Easeinout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.easeinout = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        if (n == 0) {\n            return 0;\n        }\n        var q = .48 - n / 1.04,\n            Q = Math.sqrt(.1734 + q * q),\n            x = Q - q,\n            X = Math.pow(Math.abs(x), 1 / 3) * (x < 0 ? -1 : 1),\n            y = -Q - q,\n            Y = Math.pow(Math.abs(y), 1 / 3) * (y < 0 ? -1 : 1),\n            t = X + Y + .5;\n        return (1 - t) * 3 * t * t + t * t * t;\n    };\n    /*\\\n     * mina.backin\n     [ method ]\n     **\n     * Backin easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backin = function (n) {\n        if (n == 1) {\n            return 1;\n        }\n        var s = 1.70158;\n        return n * n * ((s + 1) * n - s);\n    };\n    /*\\\n     * mina.backout\n     [ method ]\n     **\n     * Backout easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.backout = function (n) {\n        if (n == 0) {\n            return 0;\n        }\n        n = n - 1;\n        var s = 1.70158;\n        return n * n * ((s + 1) * n + s) + 1;\n    };\n    /*\\\n     * mina.elastic\n     [ method ]\n     **\n     * Elastic easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.elastic = function (n) {\n        if (n == !!n) {\n            return n;\n        }\n        return Math.pow(2, -10 * n) * Math.sin((n - .075) *\n            (2 * Math.PI) / .3) + 1;\n    };\n    /*\\\n     * mina.bounce\n     [ method ]\n     **\n     * Bounce easing\n     - n (number) input 0..1\n     = (number) output 0..1\n    \\*/\n    mina.bounce = function (n) {\n        var s = 7.5625,\n            p = 2.75,\n            l;\n        if (n < 1 / p) {\n            l = s * n * n;\n        } else {\n            if (n < 2 / p) {\n                n -= 1.5 / p;\n                l = s * n * n + .75;\n            } else {\n                if (n < 2.5 / p) {\n                    n -= 2.25 / p;\n                    l = s * n * n + .9375;\n                } else {\n                    n -= 2.625 / p;\n                    l = s * n * n + .984375;\n                }\n            }\n        }\n        return l;\n    };\n    window.mina = mina;\n    return mina;\n})(typeof eve == \"undefined\" ? function () {} : eve);\n"
  },
  {
    "path": "src/mouse.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n    has = \"hasOwnProperty\",\n    supportsTouch = (('ontouchstart' in window) || window.TouchEvent || window.DocumentTouch && document instanceof DocumentTouch),\n    events = [\n        \"click\", \"dblclick\", \"mousedown\", \"mousemove\", \"mouseout\",\n        \"mouseover\", \"mouseup\", \"touchstart\", \"touchmove\", \"touchend\",\n        \"touchcancel\"\n    ],\n    touchMap = {\n        mousedown: \"touchstart\",\n        mousemove: \"touchmove\",\n        mouseup: \"touchend\"\n    },\n    getScroll = function (xy, el) {\n        var name = xy == \"y\" ? \"scrollTop\" : \"scrollLeft\",\n            doc = el && el.node ? el.node.ownerDocument : glob.doc;\n        return doc[name in doc.documentElement ? \"documentElement\" : \"body\"][name];\n    },\n    preventDefault = function () {\n        this.returnValue = false;\n    },\n    preventTouch = function () {\n        return this.originalEvent.preventDefault();\n    },\n    stopPropagation = function () {\n        this.cancelBubble = true;\n    },\n    stopTouch = function () {\n        return this.originalEvent.stopPropagation();\n    },\n    addEvent = function (obj, type, fn, element) {\n        var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,\n            f = function (e) {\n                var scrollY = getScroll(\"y\", element),\n                    scrollX = getScroll(\"x\", element);\n                if (supportsTouch && touchMap[has](type)) {\n                    for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {\n                        if (e.targetTouches[i].target == obj || obj.contains(e.targetTouches[i].target)) {\n                            var olde = e;\n                            e = e.targetTouches[i];\n                            e.originalEvent = olde;\n                            e.preventDefault = preventTouch;\n                            e.stopPropagation = stopTouch;\n                            break;\n                        }\n                    }\n                }\n                var x = e.clientX + scrollX,\n                    y = e.clientY + scrollY;\n                return fn.call(element, e, x, y);\n            };\n\n        if (type !== realName) {\n            obj.addEventListener(type, f, false);\n        }\n\n        obj.addEventListener(realName, f, false);\n\n        return function () {\n            if (type !== realName) {\n                obj.removeEventListener(type, f, false);\n            }\n\n            obj.removeEventListener(realName, f, false);\n            return true;\n        };\n    },\n    drag = [],\n    dragMove = function (e) {\n        var x = e.clientX,\n            y = e.clientY,\n            scrollY = getScroll(\"y\"),\n            scrollX = getScroll(\"x\"),\n            dragi,\n            j = drag.length;\n        while (j--) {\n            dragi = drag[j];\n            if (supportsTouch) {\n                var i = e.touches && e.touches.length,\n                    touch;\n                while (i--) {\n                    touch = e.touches[i];\n                    if (touch.identifier == dragi.el._drag.id || dragi.el.node.contains(touch.target)) {\n                        x = touch.clientX;\n                        y = touch.clientY;\n                        (e.originalEvent ? e.originalEvent : e).preventDefault();\n                        break;\n                    }\n                }\n            } else {\n                e.preventDefault();\n            }\n            var node = dragi.el.node,\n                o,\n                next = node.nextSibling,\n                parent = node.parentNode,\n                display = node.style.display;\n            // glob.win.opera && parent.removeChild(node);\n            // node.style.display = \"none\";\n            // o = dragi.el.paper.getElementByPoint(x, y);\n            // node.style.display = display;\n            // glob.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));\n            // o && eve(\"snap.drag.over.\" + dragi.el.id, dragi.el, o);\n            x += scrollX;\n            y += scrollY;\n            eve(\"snap.drag.move.\" + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);\n        }\n    },\n    dragUp = function (e) {\n        Snap.unmousemove(dragMove).unmouseup(dragUp);\n        var i = drag.length,\n            dragi;\n        while (i--) {\n            dragi = drag[i];\n            dragi.el._drag = {};\n            eve(\"snap.drag.end.\" + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);\n            eve.off(\"snap.drag.*.\" + dragi.el.id);\n        }\n        drag = [];\n    };\n    /*\\\n     * Element.click\n     [ method ]\n     **\n     * Adds a click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unclick\n     [ method ]\n     **\n     * Removes a click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.dblclick\n     [ method ]\n     **\n     * Adds a double click event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.undblclick\n     [ method ]\n     **\n     * Removes a double click event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousedown\n     [ method ]\n     **\n     * Adds a mousedown event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousedown\n     [ method ]\n     **\n     * Removes a mousedown event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mousemove\n     [ method ]\n     **\n     * Adds a mousemove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmousemove\n     [ method ]\n     **\n     * Removes a mousemove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseout\n     [ method ]\n     **\n     * Adds a mouseout event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseout\n     [ method ]\n     **\n     * Removes a mouseout event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseover\n     [ method ]\n     **\n     * Adds a mouseover event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseover\n     [ method ]\n     **\n     * Removes a mouseover event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.mouseup\n     [ method ]\n     **\n     * Adds a mouseup event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.unmouseup\n     [ method ]\n     **\n     * Removes a mouseup event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchstart\n     [ method ]\n     **\n     * Adds a touchstart event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchstart\n     [ method ]\n     **\n     * Removes a touchstart event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchmove\n     [ method ]\n     **\n     * Adds a touchmove event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchmove\n     [ method ]\n     **\n     * Removes a touchmove event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchend\n     [ method ]\n     **\n     * Adds a touchend event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchend\n     [ method ]\n     **\n     * Removes a touchend event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    \n    /*\\\n     * Element.touchcancel\n     [ method ]\n     **\n     * Adds a touchcancel event handler to the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    /*\\\n     * Element.untouchcancel\n     [ method ]\n     **\n     * Removes a touchcancel event handler from the element\n     - handler (function) handler for the event\n     = (object) @Element\n    \\*/\n    for (var i = events.length; i--;) {\n        (function (eventName) {\n            Snap[eventName] = elproto[eventName] = function (fn, scope) {\n                if (Snap.is(fn, \"function\")) {\n                    this.events = this.events || [];\n                    this.events.push({\n                        name: eventName,\n                        f: fn,\n                        unbind: addEvent(this.node || document, eventName, fn, scope || this)\n                    });\n                } else {\n                    for (var i = 0, ii = this.events.length; i < ii; i++) if (this.events[i].name == eventName) {\n                        try {\n                            this.events[i].f.call(this);\n                        } catch (e) {}\n                    }\n                }\n                return this;\n            };\n            Snap[\"un\" + eventName] =\n            elproto[\"un\" + eventName] = function (fn) {\n                var events = this.events || [],\n                    l = events.length;\n                while (l--) if (events[l].name == eventName &&\n                               (events[l].f == fn || !fn)) {\n                    events[l].unbind();\n                    events.splice(l, 1);\n                    !events.length && delete this.events;\n                    return this;\n                }\n                return this;\n            };\n        })(events[i]);\n    }\n    /*\\\n     * Element.hover\n     [ method ]\n     **\n     * Adds hover event handlers to the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     - icontext (object) #optional context for hover in handler\n     - ocontext (object) #optional context for hover out handler\n     = (object) @Element\n    \\*/\n    elproto.hover = function (f_in, f_out, scope_in, scope_out) {\n        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);\n    };\n    /*\\\n     * Element.unhover\n     [ method ]\n     **\n     * Removes hover event handlers from the element\n     - f_in (function) handler for hover in\n     - f_out (function) handler for hover out\n     = (object) @Element\n    \\*/\n    elproto.unhover = function (f_in, f_out) {\n        return this.unmouseover(f_in).unmouseout(f_out);\n    };\n    var draggable = [];\n    // SIERRA unclear what _context_ refers to for starting, ending, moving the drag gesture.\n    // SIERRA Element.drag(): _x position of the mouse_: Where are the x/y values offset from?\n    // SIERRA Element.drag(): much of this member's doc appears to be duplicated for some reason.\n    // SIERRA Unclear about this sentence: _Additionally following drag events will be triggered: drag.start.<id> on start, drag.end.<id> on end and drag.move.<id> on every move._ Is there a global _drag_ object to which you can assign handlers keyed by an element's ID?\n    /*\\\n     * Element.drag\n     [ method ]\n     **\n     * Adds event handlers for an element's drag gesture\n     **\n     - onmove (function) handler for moving\n     - onstart (function) handler for drag start\n     - onend (function) handler for drag end\n     - mcontext (object) #optional context for moving handler\n     - scontext (object) #optional context for drag start handler\n     - econtext (object) #optional context for drag end handler\n     * Additionaly following `drag` events are triggered: `drag.start.<id>` on start, \n     * `drag.end.<id>` on end and `drag.move.<id>` on every move. When element is dragged over another element \n     * `drag.over.<id>` fires as well.\n     *\n     * Start event and start handler are called in specified context or in context of the element with following parameters:\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * Move event and move handler are called in specified context or in context of the element with following parameters:\n     o dx (number) shift by x from the start point\n     o dy (number) shift by y from the start point\n     o x (number) x position of the mouse\n     o y (number) y position of the mouse\n     o event (object) DOM event object\n     * End event and end handler are called in specified context or in context of the element with following parameters:\n     o event (object) DOM event object\n     = (object) @Element\n    \\*/\n    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {\n        var el = this;\n        if (!arguments.length) {\n            var origTransform;\n            return el.drag(function (dx, dy) {\n                this.attr({\n                    transform: origTransform + (origTransform ? \"T\" : \"t\") + [dx, dy]\n                });\n            }, function () {\n                origTransform = this.transform().local;\n            });\n        }\n        function start(e, x, y) {\n            (e.originalEvent || e).preventDefault();\n            el._drag.x = x;\n            el._drag.y = y;\n            el._drag.id = e.identifier;\n            !drag.length && Snap.mousemove(dragMove).mouseup(dragUp);\n            drag.push({el: el, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});\n            onstart && eve.on(\"snap.drag.start.\" + el.id, onstart);\n            onmove && eve.on(\"snap.drag.move.\" + el.id, onmove);\n            onend && eve.on(\"snap.drag.end.\" + el.id, onend);\n            eve(\"snap.drag.start.\" + el.id, start_scope || move_scope || el, x, y, e);\n        }\n        function init(e, x, y) {\n            eve(\"snap.draginit.\" + el.id, el, e, x, y);\n        }\n        eve.on(\"snap.draginit.\" + el.id, start);\n        el._drag = {};\n        draggable.push({el: el, start: start, init: init});\n        el.mousedown(init);\n        return el;\n    };\n    /*\n     * Element.onDragOver\n     [ method ]\n     **\n     * Shortcut to assign event handler for `drag.over.<id>` event, where `id` is the element's `id` (see @Element.id)\n     - f (function) handler for event, first argument would be the element you are dragging over\n    \\*/\n    // elproto.onDragOver = function (f) {\n    //     f ? eve.on(\"snap.drag.over.\" + this.id, f) : eve.unbind(\"snap.drag.over.\" + this.id);\n    // };\n    /*\\\n     * Element.undrag\n     [ method ]\n     **\n     * Removes all drag event handlers from the given element\n    \\*/\n    elproto.undrag = function () {\n        var i = draggable.length;\n        while (i--) if (draggable[i].el == this) {\n            this.unmousedown(draggable[i].init);\n            draggable.splice(i, 1);\n            eve.unbind(\"snap.drag.*.\" + this.id);\n            eve.unbind(\"snap.draginit.\" + this.id);\n        }\n        !draggable.length && Snap.unmousemove(dragMove).unmouseup(dragUp);\n        return this;\n    };\n});\n"
  },
  {
    "path": "src/paper.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob, Fragment) {\n    var proto = Paper.prototype,\n        is = Snap.is;\n    /*\\\n     * Paper.rect\n     [ method ]\n     *\n     * Draws a rectangle\n     **\n     - x (number) x coordinate of the top left corner\n     - y (number) y coordinate of the top left corner\n     - width (number) width\n     - height (number) height\n     - rx (number) #optional horizontal radius for rounded corners, default is 0\n     - ry (number) #optional vertical radius for rounded corners, default is rx or 0\n     = (object) the `rect` element\n     **\n     > Usage\n     | // regular rectangle\n     | var c = paper.rect(10, 10, 50, 50);\n     | // rectangle with rounded corners\n     | var c = paper.rect(40, 40, 50, 50, 10);\n    \\*/\n    proto.rect = function (x, y, w, h, rx, ry) {\n        var attr;\n        if (ry == null) {\n            ry = rx;\n        }\n        if (is(x, \"object\") && x == \"[object Object]\") {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                width: w,\n                height: h\n            };\n            if (rx != null) {\n                attr.rx = rx;\n                attr.ry = ry;\n            }\n        }\n        return this.el(\"rect\", attr);\n    };\n    /*\\\n     * Paper.circle\n     [ method ]\n     **\n     * Draws a circle\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - r (number) radius\n     = (object) the `circle` element\n     **\n     > Usage\n     | var c = paper.circle(50, 50, 40);\n    \\*/\n    proto.circle = function (cx, cy, r) {\n        var attr;\n        if (is(cx, \"object\") && cx == \"[object Object]\") {\n            attr = cx;\n        } else if (cx != null) {\n            attr = {\n                cx: cx,\n                cy: cy,\n                r: r\n            };\n        }\n        return this.el(\"circle\", attr);\n    };\n\n    var preload = (function () {\n        function onerror() {\n            this.parentNode.removeChild(this);\n        }\n        return function (src, f) {\n            var img = glob.doc.createElement(\"img\"),\n                body = glob.doc.body;\n            img.style.cssText = \"position:absolute;left:-9999em;top:-9999em\";\n            img.onload = function () {\n                f.call(img);\n                img.onload = img.onerror = null;\n                body.removeChild(img);\n            };\n            img.onerror = onerror;\n            body.appendChild(img);\n            img.src = src;\n        };\n    }());\n\n    /*\\\n     * Paper.image\n     [ method ]\n     **\n     * Places an image on the surface\n     **\n     - src (string) URI of the source image\n     - x (number) x offset position\n     - y (number) y offset position\n     - width (number) width of the image\n     - height (number) height of the image\n     = (object) the `image` element\n     * or\n     = (object) Snap element object with type `image`\n     **\n     > Usage\n     | var c = paper.image(\"apple.png\", 10, 10, 80, 80);\n    \\*/\n    proto.image = function (src, x, y, width, height) {\n        var el = this.el(\"image\");\n        if (is(src, \"object\") && \"src\" in src) {\n            el.attr(src);\n        } else if (src != null) {\n            var set = {\n                \"xlink:href\": src,\n                preserveAspectRatio: \"none\"\n            };\n            if (x != null && y != null) {\n                set.x = x;\n                set.y = y;\n            }\n            if (width != null && height != null) {\n                set.width = width;\n                set.height = height;\n            } else {\n                preload(src, function () {\n                    Snap._.$(el.node, {\n                        width: this.offsetWidth,\n                        height: this.offsetHeight\n                    });\n                });\n            }\n            Snap._.$(el.node, set);\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ellipse\n     [ method ]\n     **\n     * Draws an ellipse\n     **\n     - x (number) x coordinate of the centre\n     - y (number) y coordinate of the centre\n     - rx (number) horizontal radius\n     - ry (number) vertical radius\n     = (object) the `ellipse` element\n     **\n     > Usage\n     | var c = paper.ellipse(50, 50, 40, 20);\n    \\*/\n    proto.ellipse = function (cx, cy, rx, ry) {\n        var attr;\n        if (is(cx, \"object\") && cx == \"[object Object]\") {\n            attr = cx;\n        } else if (cx != null) {\n            attr ={\n                cx: cx,\n                cy: cy,\n                rx: rx,\n                ry: ry\n            };\n        }\n        return this.el(\"ellipse\", attr);\n    };\n    // SIERRA Paper.path(): Unclear from the link what a Catmull-Rom curveto is, and why it would make life any easier.\n    /*\\\n     * Paper.path\n     [ method ]\n     **\n     * Creates a `<path>` element using the given string as the path's definition\n     - pathString (string) #optional path string in SVG format\n     * Path string consists of one-letter commands, followed by comma seprarated arguments in numerical form. Example:\n     | \"M10,20L30,40\"\n     * This example features two commands: `M`, with arguments `(10, 20)` and `L` with arguments `(30, 40)`. Uppercase letter commands express coordinates in absolute terms, while lowercase commands express them in relative terms from the most recently declared coordinates.\n     *\n     # <p>Here is short list of commands available, for more details see <a href=\"http://www.w3.org/TR/SVG/paths.html#PathData\" title=\"Details of a path's data attribute's format are described in the SVG specification.\">SVG path string format</a> or <a href=\"https://developer.mozilla.org/en/SVG/Tutorial/Paths\">article about path strings at MDN</a>.</p>\n     # <table><thead><tr><th>Command</th><th>Name</th><th>Parameters</th></tr></thead><tbody>\n     # <tr><td>M</td><td>moveto</td><td>(x y)+</td></tr>\n     # <tr><td>Z</td><td>closepath</td><td>(none)</td></tr>\n     # <tr><td>L</td><td>lineto</td><td>(x y)+</td></tr>\n     # <tr><td>H</td><td>horizontal lineto</td><td>x+</td></tr>\n     # <tr><td>V</td><td>vertical lineto</td><td>y+</td></tr>\n     # <tr><td>C</td><td>curveto</td><td>(x1 y1 x2 y2 x y)+</td></tr>\n     # <tr><td>S</td><td>smooth curveto</td><td>(x2 y2 x y)+</td></tr>\n     # <tr><td>Q</td><td>quadratic Bézier curveto</td><td>(x1 y1 x y)+</td></tr>\n     # <tr><td>T</td><td>smooth quadratic Bézier curveto</td><td>(x y)+</td></tr>\n     # <tr><td>A</td><td>elliptical arc</td><td>(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+</td></tr>\n     # <tr><td>R</td><td><a href=\"http://en.wikipedia.org/wiki/Catmull–Rom_spline#Catmull.E2.80.93Rom_spline\">Catmull-Rom curveto</a>*</td><td>x1 y1 (x y)+</td></tr></tbody></table>\n     * * _Catmull-Rom curveto_ is a not standard SVG command and added to make life easier.\n     * Note: there is a special case when a path consists of only three commands: `M10,10R…z`. In this case the path connects back to its starting point.\n     > Usage\n     | var c = paper.path(\"M10 10L90 90\");\n     | // draw a diagonal line:\n     | // move to 10,10, line to 90,90\n    \\*/\n    proto.path = function (d) {\n        var attr;\n        if (is(d, \"object\") && !is(d, \"array\")) {\n            attr = d;\n        } else if (d) {\n            attr = {d: d};\n        }\n        return this.el(\"path\", attr);\n    };\n    /*\\\n     * Paper.g\n     [ method ]\n     **\n     * Creates a group element\n     **\n     - varargs (…) #optional elements to nest within the group\n     = (object) the `g` element\n     **\n     > Usage\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g(c2, c1); // note that the order of elements is different\n     * or\n     | var c1 = paper.circle(),\n     |     c2 = paper.rect(),\n     |     g = paper.g();\n     | g.add(c2, c1);\n    \\*/\n    /*\\\n     * Paper.group\n     [ method ]\n     **\n     * See @Paper.g\n    \\*/\n    proto.group = proto.g = function (first) {\n        var attr,\n            el = this.el(\"g\");\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.svg\n     [ method ]\n     **\n     * Creates a nested SVG element.\n     - x (number) @optional X of the element\n     - y (number) @optional Y of the element\n     - width (number) @optional width of the element\n     - height (number) @optional height of the element\n     - vbx (number) @optional viewbox X\n     - vby (number) @optional viewbox Y\n     - vbw (number) @optional viewbox width\n     - vbh (number) @optional viewbox height\n     **\n     = (object) the `svg` element\n     **\n    \\*/\n    proto.svg = function (x, y, width, height, vbx, vby, vbw, vbh) {\n        var attrs = {};\n        if (is(x, \"object\") && y == null) {\n            attrs = x;\n        } else {\n            if (x != null) {\n                attrs.x = x;\n            }\n            if (y != null) {\n                attrs.y = y;\n            }\n            if (width != null) {\n                attrs.width = width;\n            }\n            if (height != null) {\n                attrs.height = height;\n            }\n            if (vbx != null && vby != null && vbw != null && vbh != null) {\n                attrs.viewBox = [vbx, vby, vbw, vbh];\n            }\n        }\n        return this.el(\"svg\", attrs);\n    };\n    /*\\\n     * Paper.mask\n     [ method ]\n     **\n     * Equivalent in behaviour to @Paper.g, except it’s a mask.\n     **\n     = (object) the `mask` element\n     **\n    \\*/\n    proto.mask = function (first) {\n        var attr,\n            el = this.el(\"mask\");\n        if (arguments.length == 1 && first && !first.type) {\n            el.attr(first);\n        } else if (arguments.length) {\n            el.add(Array.prototype.slice.call(arguments, 0));\n        }\n        return el;\n    };\n    /*\\\n     * Paper.ptrn\n     [ method ]\n     **\n     * Equivalent in behaviour to @Paper.g, except it’s a pattern.\n     - x (number) @optional X of the element\n     - y (number) @optional Y of the element\n     - width (number) @optional width of the element\n     - height (number) @optional height of the element\n     - vbx (number) @optional viewbox X\n     - vby (number) @optional viewbox Y\n     - vbw (number) @optional viewbox width\n     - vbh (number) @optional viewbox height\n     **\n     = (object) the `pattern` element\n     **\n    \\*/\n    proto.ptrn = function (x, y, width, height, vx, vy, vw, vh) {\n        if (is(x, \"object\")) {\n            var attr = x;\n        } else {\n            attr = {patternUnits: \"userSpaceOnUse\"};\n            if (x) {\n                attr.x = x;\n            }\n            if (y) {\n                attr.y = y;\n            }\n            if (width != null) {\n                attr.width = width;\n            }\n            if (height != null) {\n                attr.height = height;\n            }\n            if (vx != null && vy != null && vw != null && vh != null) {\n                attr.viewBox = [vx, vy, vw, vh];\n            } else {\n                attr.viewBox = [x || 0, y || 0, width || 0, height || 0];\n            }\n        }\n        return this.el(\"pattern\", attr);\n    };\n    /*\\\n     * Paper.use\n     [ method ]\n     **\n     * Creates a <use> element.\n     - id (string) @optional id of element to link\n     * or\n     - id (Element) @optional element to link\n     **\n     = (object) the `use` element\n     **\n    \\*/\n    proto.use = function (id) {\n        if (id != null) {\n            if (id instanceof Element) {\n                if (!id.attr(\"id\")) {\n                    id.attr({id: Snap._.id(id)});\n                }\n                id = id.attr(\"id\");\n            }\n            if (String(id).charAt() == \"#\") {\n                id = id.substring(1);\n            }\n            return this.el(\"use\", {\"xlink:href\": \"#\" + id});\n        } else {\n            return Element.prototype.use.call(this);\n        }\n    };\n    /*\\\n     * Paper.symbol\n     [ method ]\n     **\n     * Creates a <symbol> element.\n     - vbx (number) @optional viewbox X\n     - vby (number) @optional viewbox Y\n     - vbw (number) @optional viewbox width\n     - vbh (number) @optional viewbox height\n     = (object) the `symbol` element\n     **\n    \\*/\n    proto.symbol = function (vx, vy, vw, vh) {\n        var attr = {};\n        if (vx != null && vy != null && vw != null && vh != null) {\n            attr.viewBox = [vx, vy, vw, vh];\n        }\n\n        return this.el(\"symbol\", attr);\n    };\n    /*\\\n     * Paper.text\n     [ method ]\n     **\n     * Draws a text string\n     **\n     - x (number) x coordinate position\n     - y (number) y coordinate position\n     - text (string|array) The text string to draw or array of strings to nest within separate `<tspan>` elements\n     = (object) the `text` element\n     **\n     > Usage\n     | var t1 = paper.text(50, 50, \"Snap\");\n     | var t2 = paper.text(50, 50, [\"S\",\"n\",\"a\",\"p\"]);\n     | // Text path usage\n     | t1.attr({textpath: \"M10,10L100,100\"});\n     | // or\n     | var pth = paper.path(\"M10,10L100,100\");\n     | t1.attr({textpath: pth});\n    \\*/\n    proto.text = function (x, y, text) {\n        var attr = {};\n        if (is(x, \"object\")) {\n            attr = x;\n        } else if (x != null) {\n            attr = {\n                x: x,\n                y: y,\n                text: text || \"\"\n            };\n        }\n        return this.el(\"text\", attr);\n    };\n    /*\\\n     * Paper.line\n     [ method ]\n     **\n     * Draws a line\n     **\n     - x1 (number) x coordinate position of the start\n     - y1 (number) y coordinate position of the start\n     - x2 (number) x coordinate position of the end\n     - y2 (number) y coordinate position of the end\n     = (object) the `line` element\n     **\n     > Usage\n     | var t1 = paper.line(50, 50, 100, 100);\n    \\*/\n    proto.line = function (x1, y1, x2, y2) {\n        var attr = {};\n        if (is(x1, \"object\")) {\n            attr = x1;\n        } else if (x1 != null) {\n            attr = {\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            };\n        }\n        return this.el(\"line\", attr);\n    };\n    /*\\\n     * Paper.polyline\n     [ method ]\n     **\n     * Draws a polyline\n     **\n     - points (array) array of points\n     * or\n     - varargs (…) points\n     = (object) the `polyline` element\n     **\n     > Usage\n     | var p1 = paper.polyline([10, 10, 100, 100]);\n     | var p2 = paper.polyline(10, 10, 100, 100);\n    \\*/\n    proto.polyline = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var attr = {};\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            attr = points;\n        } else if (points != null) {\n            attr = {points: points};\n        }\n        return this.el(\"polyline\", attr);\n    };\n    /*\\\n     * Paper.polygon\n     [ method ]\n     **\n     * Draws a polygon. See @Paper.polyline\n    \\*/\n    proto.polygon = function (points) {\n        if (arguments.length > 1) {\n            points = Array.prototype.slice.call(arguments, 0);\n        }\n        var attr = {};\n        if (is(points, \"object\") && !is(points, \"array\")) {\n            attr = points;\n        } else if (points != null) {\n            attr = {points: points};\n        }\n        return this.el(\"polygon\", attr);\n    };\n    // gradients\n    (function () {\n        var $ = Snap._.$;\n        // gradients' helpers\n        /*\\\n         * Element.stops\n         [ method ]\n         **\n         * Only for gradients!\n         * Returns array of gradient stops elements.\n         = (array) the stops array.\n        \\*/\n        function Gstops() {\n            return this.selectAll(\"stop\");\n        }\n        /*\\\n         * Element.addStop\n         [ method ]\n         **\n         * Only for gradients!\n         * Adds another stop to the gradient.\n         - color (string) stops color\n         - offset (number) stops offset 0..100\n         = (object) gradient element\n        \\*/\n        function GaddStop(color, offset) {\n            var stop = $(\"stop\"),\n                attr = {\n                    offset: +offset + \"%\"\n                };\n            color = Snap.color(color);\n            attr[\"stop-color\"] = color.hex;\n            if (color.opacity < 1) {\n                attr[\"stop-opacity\"] = color.opacity;\n            }\n            $(stop, attr);\n            var stops = this.stops(),\n                inserted;\n            for (var i = 0; i < stops.length; i++) {\n                var stopOffset = parseFloat(stops[i].attr(\"offset\"));\n                if (stopOffset > offset) {\n                    this.node.insertBefore(stop, stops[i].node);\n                    inserted = true;\n                    break;\n                }\n            }\n            if (!inserted) {\n                this.node.appendChild(stop);\n            }\n            return this;\n        }\n        function GgetBBox() {\n            if (this.type == \"linearGradient\") {\n                var x1 = $(this.node, \"x1\") || 0,\n                    x2 = $(this.node, \"x2\") || 1,\n                    y1 = $(this.node, \"y1\") || 0,\n                    y2 = $(this.node, \"y2\") || 0;\n                return Snap._.box(x1, y1, math.abs(x2 - x1), math.abs(y2 - y1));\n            } else {\n                var cx = this.node.cx || .5,\n                    cy = this.node.cy || .5,\n                    r = this.node.r || 0;\n                return Snap._.box(cx - r, cy - r, r * 2, r * 2);\n            }\n        }\n        /*\\\n         * Element.setStops\n         [ method ]\n         **\n         * Only for gradients!\n         * Updates stops of the gradient based on passed gradient descriptor. See @Ppaer.gradient\n         - str (string) gradient descriptor part after `()`.\n         = (object) gradient element\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         | g.setStops(\"#fff-#000-#f00-#fc0\");\n        \\*/\n        function GsetStops(str) {\n            var grad = str,\n                stops = this.stops();\n            if (typeof str == \"string\") {\n                grad = eve(\"snap.util.grad.parse\", null, \"l(0,0,0,1)\" + str).firstDefined().stops;\n            }\n            if (!Snap.is(grad, \"array\")) {\n                return;\n            }\n            for (var i = 0; i < stops.length; i++) {\n                if (grad[i]) {\n                    var color = Snap.color(grad[i].color),\n                        attr = {\"offset\": grad[i].offset + \"%\"};\n                    attr[\"stop-color\"] = color.hex;\n                    if (color.opacity < 1) {\n                        attr[\"stop-opacity\"] = color.opacity;\n                    }\n                    stops[i].attr(attr);\n                } else {\n                    stops[i].remove();\n                }\n            }\n            for (i = stops.length; i < grad.length; i++) {\n                this.addStop(grad[i].color, grad[i].offset);\n            }\n            return this;\n        }\n        function gradient(defs, str) {\n            var grad = eve(\"snap.util.grad.parse\", null, str).firstDefined(),\n                el;\n            if (!grad) {\n                return null;\n            }\n            grad.params.unshift(defs);\n            if (grad.type.toLowerCase() == \"l\") {\n                el = gradientLinear.apply(0, grad.params);\n            } else {\n                el = gradientRadial.apply(0, grad.params);\n            }\n            if (grad.type != grad.type.toLowerCase()) {\n                $(el.node, {\n                    gradientUnits: \"userSpaceOnUse\"\n                });\n            }\n            var stops = grad.stops,\n                len = stops.length;\n            for (var i = 0; i < len; i++) {\n                var stop = stops[i];\n                el.addStop(stop.color, stop.offset);\n            }\n            return el;\n        }\n        function gradientLinear(defs, x1, y1, x2, y2) {\n            var el = Snap._.make(\"linearGradient\", defs);\n            el.stops = Gstops;\n            el.addStop = GaddStop;\n            el.getBBox = GgetBBox;\n            el.setStops = GsetStops;\n            if (x1 != null) {\n                $(el.node, {\n                    x1: x1,\n                    y1: y1,\n                    x2: x2,\n                    y2: y2\n                });\n            }\n            return el;\n        }\n        function gradientRadial(defs, cx, cy, r, fx, fy) {\n            var el = Snap._.make(\"radialGradient\", defs);\n            el.stops = Gstops;\n            el.addStop = GaddStop;\n            el.getBBox = GgetBBox;\n            if (cx != null) {\n                $(el.node, {\n                    cx: cx,\n                    cy: cy,\n                    r: r\n                });\n            }\n            if (fx != null && fy != null) {\n                $(el.node, {\n                    fx: fx,\n                    fy: fy\n                });\n            }\n            return el;\n        }\n        /*\\\n         * Paper.gradient\n         [ method ]\n         **\n         * Creates a gradient element\n         **\n         - gradient (string) gradient descriptor\n         > Gradient Descriptor\n         * The gradient descriptor is an expression formatted as\n         * follows: `<type>(<coords>)<colors>`.  The `<type>` can be\n         * either linear or radial.  The uppercase `L` or `R` letters\n         * indicate absolute coordinates offset from the SVG surface.\n         * Lowercase `l` or `r` letters indicate coordinates\n         * calculated relative to the element to which the gradient is\n         * applied.  Coordinates specify a linear gradient vector as\n         * `x1`, `y1`, `x2`, `y2`, or a radial gradient as `cx`, `cy`,\n         * `r` and optional `fx`, `fy` specifying a focal point away\n         * from the center of the circle. Specify `<colors>` as a list\n         * of dash-separated CSS color values.  Each color may be\n         * followed by a custom offset value, separated with a colon\n         * character.\n         > Examples\n         * Linear gradient, relative from top-left corner to bottom-right\n         * corner, from black through red to white:\n         | var g = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n         * Linear gradient, absolute from (0, 0) to (100, 100), from black\n         * through red at 25% to white:\n         | var g = paper.gradient(\"L(0, 0, 100, 100)#000-#f00:25-#fff\");\n         * Radial gradient, relative from the center of the element with radius\n         * half the width, from black to white:\n         | var g = paper.gradient(\"r(0.5, 0.5, 0.5)#000-#fff\");\n         * To apply the gradient:\n         | paper.circle(50, 50, 40).attr({\n         |     fill: g\n         | });\n         = (object) the `gradient` element\n        \\*/\n        proto.gradient = function (str) {\n            return gradient(this.defs, str);\n        };\n        proto.gradientLinear = function (x1, y1, x2, y2) {\n            return gradientLinear(this.defs, x1, y1, x2, y2);\n        };\n        proto.gradientRadial = function (cx, cy, r, fx, fy) {\n            return gradientRadial(this.defs, cx, cy, r, fx, fy);\n        };\n        /*\\\n         * Paper.toString\n         [ method ]\n         **\n         * Returns SVG code for the @Paper\n         = (string) SVG code for the @Paper\n        \\*/\n        proto.toString = function () {\n            var doc = this.node.ownerDocument,\n                f = doc.createDocumentFragment(),\n                d = doc.createElement(\"div\"),\n                svg = this.node.cloneNode(true),\n                res;\n            f.appendChild(d);\n            d.appendChild(svg);\n            Snap._.$(svg, {xmlns: \"http://www.w3.org/2000/svg\"});\n            res = d.innerHTML;\n            f.removeChild(f.firstChild);\n            return res;\n        };\n        /*\\\n         * Paper.toDataURL\n         [ method ]\n         **\n         * Returns SVG code for the @Paper as Data URI string.\n         = (string) Data URI string\n        \\*/\n        proto.toDataURL = function () {\n            if (window && window.btoa) {\n                return \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(this)));\n            }\n        };\n        /*\\\n         * Paper.clear\n         [ method ]\n         **\n         * Removes all child nodes of the paper, except <defs>.\n        \\*/\n        proto.clear = function () {\n            var node = this.node.firstChild,\n                next;\n            while (node) {\n                next = node.nextSibling;\n                if (node.tagName != \"defs\") {\n                    node.parentNode.removeChild(node);\n                } else {\n                    proto.clear.call({node: node});\n                }\n                node = next;\n            }\n        };\n    }());\n});\n"
  },
  {
    "path": "src/path.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var elproto = Element.prototype,\n        is = Snap.is,\n        clone = Snap._.clone,\n        has = \"hasOwnProperty\",\n        p2s = /,?([a-z]),?/gi,\n        toFloat = parseFloat,\n        math = Math,\n        PI = math.PI,\n        mmin = math.min,\n        mmax = math.max,\n        pow = math.pow,\n        abs = math.abs;\n    function paths(ps) {\n        var p = paths.ps = paths.ps || {};\n        if (p[ps]) {\n            p[ps].sleep = 100;\n        } else {\n            p[ps] = {\n                sleep: 100\n            };\n        }\n        setTimeout(function () {\n            for (var key in p) if (p[has](key) && key != ps) {\n                p[key].sleep--;\n                !p[key].sleep && delete p[key];\n            }\n        });\n        return p[ps];\n    }\n    function box(x, y, width, height) {\n        if (x == null) {\n            x = y = width = height = 0;\n        }\n        if (y == null) {\n            y = x.y;\n            width = x.width;\n            height = x.height;\n            x = x.x;\n        }\n        return {\n            x: x,\n            y: y,\n            width: width,\n            w: width,\n            height: height,\n            h: height,\n            x2: x + width,\n            y2: y + height,\n            cx: x + width / 2,\n            cy: y + height / 2,\n            r1: math.min(width, height) / 2,\n            r2: math.max(width, height) / 2,\n            r0: math.sqrt(width * width + height * height) / 2,\n            path: rectPath(x, y, width, height),\n            vb: [x, y, width, height].join(\" \")\n        };\n    }\n    function toString() {\n        return this.join(\",\").replace(p2s, \"$1\");\n    }\n    function pathClone(pathArray) {\n        var res = clone(pathArray);\n        res.toString = toString;\n        return res;\n    }\n    function getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {\n        if (length == null) {\n            return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);\n        } else {\n            return findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y,\n                getTotLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length));\n        }\n    }\n    function getLengthFactory(istotal, subpath) {\n        function O(val) {\n            return +(+val).toFixed(3);\n        }\n        return Snap._.cacher(function (path, length, onlystart) {\n            if (path instanceof Element) {\n                path = path.attr(\"d\");\n            }\n            path = path2curve(path);\n            var x, y, p, l, sp = \"\", subpaths = {}, point,\n                len = 0;\n            for (var i = 0, ii = path.length; i < ii; i++) {\n                p = path[i];\n                if (p[0] == \"M\") {\n                    x = +p[1];\n                    y = +p[2];\n                } else {\n                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                    if (len + l > length) {\n                        if (subpath && !subpaths.start) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            sp += [\n                                \"C\" + O(point.start.x),\n                                O(point.start.y),\n                                O(point.m.x),\n                                O(point.m.y),\n                                O(point.x),\n                                O(point.y)\n                            ];\n                            if (onlystart) {return sp;}\n                            subpaths.start = sp;\n                            sp = [\n                                \"M\" + O(point.x),\n                                O(point.y) + \"C\" + O(point.n.x),\n                                O(point.n.y),\n                                O(point.end.x),\n                                O(point.end.y),\n                                O(p[5]),\n                                O(p[6])\n                            ].join();\n                            len += l;\n                            x = +p[5];\n                            y = +p[6];\n                            continue;\n                        }\n                        if (!istotal && !subpath) {\n                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);\n                            return point;\n                        }\n                    }\n                    len += l;\n                    x = +p[5];\n                    y = +p[6];\n                }\n                sp += p.shift() + p;\n            }\n            subpaths.end = sp;\n            point = istotal ? len : subpath ? subpaths : findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);\n            return point;\n        }, null, Snap._.clone);\n    }\n    var getTotalLength = getLengthFactory(1),\n        getPointAtLength = getLengthFactory(),\n        getSubpathsAtLength = getLengthFactory(0, 1);\n    function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t,\n            t13 = pow(t1, 3),\n            t12 = pow(t1, 2),\n            t2 = t * t,\n            t3 = t2 * t,\n            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,\n            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,\n            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),\n            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),\n            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),\n            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),\n            ax = t1 * p1x + t * c1x,\n            ay = t1 * p1y + t * c1y,\n            cx = t1 * c2x + t * p2x,\n            cy = t1 * c2y + t * p2y,\n            alpha = 90 - math.atan2(mx - nx, my - ny) * 180 / PI;\n        // (mx > nx || my < ny) && (alpha += 180);\n        return {\n            x: x,\n            y: y,\n            m: {x: mx, y: my},\n            n: {x: nx, y: ny},\n            start: {x: ax, y: ay},\n            end: {x: cx, y: cy},\n            alpha: alpha\n        };\n    }\n    function bezierBBox(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {\n        if (!Snap.is(p1x, \"array\")) {\n            p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y];\n        }\n        var bbox = curveDim.apply(null, p1x);\n        return box(\n            bbox.min.x,\n            bbox.min.y,\n            bbox.max.x - bbox.min.x,\n            bbox.max.y - bbox.min.y\n        );\n    }\n    function isPointInsideBBox(bbox, x, y) {\n        return  x >= bbox.x &&\n                x <= bbox.x + bbox.width &&\n                y >= bbox.y &&\n                y <= bbox.y + bbox.height;\n    }\n    function isBBoxIntersect(bbox1, bbox2) {\n        bbox1 = box(bbox1);\n        bbox2 = box(bbox2);\n        return isPointInsideBBox(bbox2, bbox1.x, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y)\n            || isPointInsideBBox(bbox2, bbox1.x, bbox1.y2)\n            || isPointInsideBBox(bbox2, bbox1.x2, bbox1.y2)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y)\n            || isPointInsideBBox(bbox1, bbox2.x, bbox2.y2)\n            || isPointInsideBBox(bbox1, bbox2.x2, bbox2.y2)\n            || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x\n                || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x)\n            && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y\n                || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y);\n    }\n    function base3(t, p1, p2, p3, p4) {\n        var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4,\n            t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3;\n        return t * t2 - 3 * p1 + 3 * p2;\n    }\n    function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {\n        if (z == null) {\n            z = 1;\n        }\n        z = z > 1 ? 1 : z < 0 ? 0 : z;\n        var z2 = z / 2,\n            n = 12,\n            Tvalues = [-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],\n            Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472],\n            sum = 0;\n        for (var i = 0; i < n; i++) {\n            var ct = z2 * Tvalues[i] + z2,\n                xbase = base3(ct, x1, x2, x3, x4),\n                ybase = base3(ct, y1, y2, y3, y4),\n                comb = xbase * xbase + ybase * ybase;\n            sum += Cvalues[i] * math.sqrt(comb);\n        }\n        return z2 * sum;\n    }\n    function getTotLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {\n        if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) {\n            return;\n        }\n        var t = 1,\n            step = t / 2,\n            t2 = t - step,\n            l,\n            e = .01;\n        l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        while (abs(l - ll) > e) {\n            step /= 2;\n            t2 += (l < ll ? 1 : -1) * step;\n            l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2);\n        }\n        return t2;\n    }\n    function intersect(x1, y1, x2, y2, x3, y3, x4, y4) {\n        if (\n            mmax(x1, x2) < mmin(x3, x4) ||\n            mmin(x1, x2) > mmax(x3, x4) ||\n            mmax(y1, y2) < mmin(y3, y4) ||\n            mmin(y1, y2) > mmax(y3, y4)\n        ) {\n            return;\n        }\n        var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n            ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n            denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n        if (!denominator) {\n            return;\n        }\n        var px = nx / denominator,\n            py = ny / denominator,\n            px2 = +px.toFixed(2),\n            py2 = +py.toFixed(2);\n        if (\n            px2 < +mmin(x1, x2).toFixed(2) ||\n            px2 > +mmax(x1, x2).toFixed(2) ||\n            px2 < +mmin(x3, x4).toFixed(2) ||\n            px2 > +mmax(x3, x4).toFixed(2) ||\n            py2 < +mmin(y1, y2).toFixed(2) ||\n            py2 > +mmax(y1, y2).toFixed(2) ||\n            py2 < +mmin(y3, y4).toFixed(2) ||\n            py2 > +mmax(y3, y4).toFixed(2)\n        ) {\n            return;\n        }\n        return {x: px, y: py};\n    }\n    function inter(bez1, bez2) {\n        return interHelper(bez1, bez2);\n    }\n    function interCount(bez1, bez2) {\n        return interHelper(bez1, bez2, 1);\n    }\n    function interHelper(bez1, bez2, justCount) {\n        var bbox1 = bezierBBox(bez1),\n            bbox2 = bezierBBox(bez2);\n        if (!isBBoxIntersect(bbox1, bbox2)) {\n            return justCount ? 0 : [];\n        }\n        var l1 = bezlen.apply(0, bez1),\n            l2 = bezlen.apply(0, bez2),\n            n1 = ~~(l1 / 8),\n            n2 = ~~(l2 / 8),\n            dots1 = [],\n            dots2 = [],\n            xy = {},\n            res = justCount ? 0 : [];\n        for (var i = 0; i < n1 + 1; i++) {\n            var p = findDotsAtSegment.apply(0, bez1.concat(i / n1));\n            dots1.push({x: p.x, y: p.y, t: i / n1});\n        }\n        for (i = 0; i < n2 + 1; i++) {\n            p = findDotsAtSegment.apply(0, bez2.concat(i / n2));\n            dots2.push({x: p.x, y: p.y, t: i / n2});\n        }\n        for (i = 0; i < n1; i++) {\n            for (var j = 0; j < n2; j++) {\n                var di = dots1[i],\n                    di1 = dots1[i + 1],\n                    dj = dots2[j],\n                    dj1 = dots2[j + 1],\n                    ci = abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n                    cj = abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n                    is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n                if (is) {\n                    if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n                        continue;\n                    }\n                    xy[is.x.toFixed(4)] = is.y.toFixed(4);\n                    var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n                        t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n                    if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1) {\n                        if (justCount) {\n                            res++;\n                        } else {\n                            res.push({\n                                x: is.x,\n                                y: is.y,\n                                t1: t1,\n                                t2: t2\n                            });\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function pathIntersection(path1, path2) {\n        return interPathHelper(path1, path2);\n    }\n    function pathIntersectionNumber(path1, path2) {\n        return interPathHelper(path1, path2, 1);\n    }\n    function interPathHelper(path1, path2, justCount) {\n        path1 = path2curve(path1);\n        path2 = path2curve(path2);\n        var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2,\n            res = justCount ? 0 : [];\n        for (var i = 0, ii = path1.length; i < ii; i++) {\n            var pi = path1[i];\n            if (pi[0] == \"M\") {\n                x1 = x1m = pi[1];\n                y1 = y1m = pi[2];\n            } else {\n                if (pi[0] == \"C\") {\n                    bez1 = [x1, y1].concat(pi.slice(1));\n                    x1 = bez1[6];\n                    y1 = bez1[7];\n                } else {\n                    bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n                    x1 = x1m;\n                    y1 = y1m;\n                }\n                for (var j = 0, jj = path2.length; j < jj; j++) {\n                    var pj = path2[j];\n                    if (pj[0] == \"M\") {\n                        x2 = x2m = pj[1];\n                        y2 = y2m = pj[2];\n                    } else {\n                        if (pj[0] == \"C\") {\n                            bez2 = [x2, y2].concat(pj.slice(1));\n                            x2 = bez2[6];\n                            y2 = bez2[7];\n                        } else {\n                            bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n                            x2 = x2m;\n                            y2 = y2m;\n                        }\n                        var intr = interHelper(bez1, bez2, justCount);\n                        if (justCount) {\n                            res += intr;\n                        } else {\n                            for (var k = 0, kk = intr.length; k < kk; k++) {\n                                intr[k].segment1 = i;\n                                intr[k].segment2 = j;\n                                intr[k].bez1 = bez1;\n                                intr[k].bez2 = bez2;\n                            }\n                            res = res.concat(intr);\n                        }\n                    }\n                }\n            }\n        }\n        return res;\n    }\n    function isPointInsidePath(path, x, y) {\n        var bbox = pathBBox(path);\n        return isPointInsideBBox(bbox, x, y) &&\n               interPathHelper(path, [[\"M\", x, y], [\"H\", bbox.x2 + 10]], 1) % 2 == 1;\n    }\n    function pathBBox(path) {\n        var pth = paths(path);\n        if (pth.bbox) {\n            return clone(pth.bbox);\n        }\n        if (!path) {\n            return box();\n        }\n        path = path2curve(path);\n        var x = 0,\n            y = 0,\n            X = [],\n            Y = [],\n            p;\n        for (var i = 0, ii = path.length; i < ii; i++) {\n            p = path[i];\n            if (p[0] == \"M\") {\n                x = p[1];\n                y = p[2];\n                X.push(x);\n                Y.push(y);\n            } else {\n                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);\n                X = X.concat(dim.min.x, dim.max.x);\n                Y = Y.concat(dim.min.y, dim.max.y);\n                x = p[5];\n                y = p[6];\n            }\n        }\n        var xmin = mmin.apply(0, X),\n            ymin = mmin.apply(0, Y),\n            xmax = mmax.apply(0, X),\n            ymax = mmax.apply(0, Y),\n            bb = box(xmin, ymin, xmax - xmin, ymax - ymin);\n        pth.bbox = clone(bb);\n        return bb;\n    }\n    function rectPath(x, y, w, h, r) {\n        if (r) {\n            return [\n                [\"M\", +x + +r, y],\n                [\"l\", w - r * 2, 0],\n                [\"a\", r, r, 0, 0, 1, r, r],\n                [\"l\", 0, h - r * 2],\n                [\"a\", r, r, 0, 0, 1, -r, r],\n                [\"l\", r * 2 - w, 0],\n                [\"a\", r, r, 0, 0, 1, -r, -r],\n                [\"l\", 0, r * 2 - h],\n                [\"a\", r, r, 0, 0, 1, r, -r],\n                [\"z\"]\n            ];\n        }\n        var res = [[\"M\", x, y], [\"l\", w, 0], [\"l\", 0, h], [\"l\", -w, 0], [\"z\"]];\n        res.toString = toString;\n        return res;\n    }\n    function ellipsePath(x, y, rx, ry, a) {\n        if (a == null && ry == null) {\n            ry = rx;\n        }\n        x = +x;\n        y = +y;\n        rx = +rx;\n        ry = +ry;\n        if (a != null) {\n            var rad = Math.PI / 180,\n                x1 = x + rx * Math.cos(-ry * rad),\n                x2 = x + rx * Math.cos(-a * rad),\n                y1 = y + rx * Math.sin(-ry * rad),\n                y2 = y + rx * Math.sin(-a * rad),\n                res = [[\"M\", x1, y1], [\"A\", rx, rx, 0, +(a - ry > 180), 0, x2, y2]];\n        } else {\n            res = [\n                [\"M\", x, y],\n                [\"m\", 0, -ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, 2 * ry],\n                [\"a\", rx, ry, 0, 1, 1, 0, -2 * ry],\n                [\"z\"]\n            ];\n        }\n        res.toString = toString;\n        return res;\n    }\n    var unit2px = Snap._unit2px,\n        getPath = {\n        path: function (el) {\n            return el.attr(\"path\");\n        },\n        circle: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx, attr.cy, attr.r);\n        },\n        ellipse: function (el) {\n            var attr = unit2px(el);\n            return ellipsePath(attr.cx || 0, attr.cy || 0, attr.rx, attr.ry);\n        },\n        rect: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height, attr.rx, attr.ry);\n        },\n        image: function (el) {\n            var attr = unit2px(el);\n            return rectPath(attr.x || 0, attr.y || 0, attr.width, attr.height);\n        },\n        line: function (el) {\n            return \"M\" + [el.attr(\"x1\") || 0, el.attr(\"y1\") || 0, el.attr(\"x2\"), el.attr(\"y2\")];\n        },\n        polyline: function (el) {\n            return \"M\" + el.attr(\"points\");\n        },\n        polygon: function (el) {\n            return \"M\" + el.attr(\"points\") + \"z\";\n        },\n        deflt: function (el) {\n            var bbox = el.node.getBBox();\n            return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);\n        }\n    };\n    function pathToRelative(pathArray) {\n        var pth = paths(pathArray),\n            lowerCase = String.prototype.toLowerCase;\n        if (pth.rel) {\n            return pathClone(pth.rel);\n        }\n        if (!Snap.is(pathArray, \"array\") || !Snap.is(pathArray && pathArray[0], \"array\")) {\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0;\n        if (pathArray[0][0] == \"M\") {\n            x = pathArray[0][1];\n            y = pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res.push([\"M\", x, y]);\n        }\n        for (var i = start, ii = pathArray.length; i < ii; i++) {\n            var r = res[i] = [],\n                pa = pathArray[i];\n            if (pa[0] != lowerCase.call(pa[0])) {\n                r[0] = lowerCase.call(pa[0]);\n                switch (r[0]) {\n                    case \"a\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +(pa[6] - x).toFixed(3);\n                        r[7] = +(pa[7] - y).toFixed(3);\n                        break;\n                    case \"v\":\n                        r[1] = +(pa[1] - y).toFixed(3);\n                        break;\n                    case \"m\":\n                        mx = pa[1];\n                        my = pa[2];\n                    default:\n                        for (var j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +(pa[j] - (j % 2 ? x : y)).toFixed(3);\n                        }\n                }\n            } else {\n                r = res[i] = [];\n                if (pa[0] == \"m\") {\n                    mx = pa[1] + x;\n                    my = pa[2] + y;\n                }\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    res[i][k] = pa[k];\n                }\n            }\n            var len = res[i].length;\n            switch (res[i][0]) {\n                case \"z\":\n                    x = mx;\n                    y = my;\n                    break;\n                case \"h\":\n                    x += +res[i][len - 1];\n                    break;\n                case \"v\":\n                    y += +res[i][len - 1];\n                    break;\n                default:\n                    x += +res[i][len - 2];\n                    y += +res[i][len - 1];\n            }\n        }\n        res.toString = toString;\n        pth.rel = pathClone(res);\n        return res;\n    }\n    function pathToAbsolute(pathArray) {\n        var pth = paths(pathArray);\n        if (pth.abs) {\n            return pathClone(pth.abs);\n        }\n        if (!is(pathArray, \"array\") || !is(pathArray && pathArray[0], \"array\")) { // rough assumption\n            pathArray = Snap.parsePathString(pathArray);\n        }\n        if (!pathArray || !pathArray.length) {\n            return [[\"M\", 0, 0]];\n        }\n        var res = [],\n            x = 0,\n            y = 0,\n            mx = 0,\n            my = 0,\n            start = 0,\n            pa0;\n        if (pathArray[0][0] == \"M\") {\n            x = +pathArray[0][1];\n            y = +pathArray[0][2];\n            mx = x;\n            my = y;\n            start++;\n            res[0] = [\"M\", x, y];\n        }\n        var crz = pathArray.length == 3 &&\n            pathArray[0][0] == \"M\" &&\n            pathArray[1][0].toUpperCase() == \"R\" &&\n            pathArray[2][0].toUpperCase() == \"Z\";\n        for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {\n            res.push(r = []);\n            pa = pathArray[i];\n            pa0 = pa[0];\n            if (pa0 != pa0.toUpperCase()) {\n                r[0] = pa0.toUpperCase();\n                switch (r[0]) {\n                    case \"A\":\n                        r[1] = pa[1];\n                        r[2] = pa[2];\n                        r[3] = pa[3];\n                        r[4] = pa[4];\n                        r[5] = pa[5];\n                        r[6] = +pa[6] + x;\n                        r[7] = +pa[7] + y;\n                        break;\n                    case \"V\":\n                        r[1] = +pa[1] + y;\n                        break;\n                    case \"H\":\n                        r[1] = +pa[1] + x;\n                        break;\n                    case \"R\":\n                        var dots = [x, y].concat(pa.slice(1));\n                        for (var j = 2, jj = dots.length; j < jj; j++) {\n                            dots[j] = +dots[j] + x;\n                            dots[++j] = +dots[j] + y;\n                        }\n                        res.pop();\n                        res = res.concat(catmullRom2bezier(dots, crz));\n                        break;\n                    case \"O\":\n                        res.pop();\n                        dots = ellipsePath(x, y, pa[1], pa[2]);\n                        dots.push(dots[0]);\n                        res = res.concat(dots);\n                        break;\n                    case \"U\":\n                        res.pop();\n                        res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                        r = [\"U\"].concat(res[res.length - 1].slice(-2));\n                        break;\n                    case \"M\":\n                        mx = +pa[1] + x;\n                        my = +pa[2] + y;\n                    default:\n                        for (j = 1, jj = pa.length; j < jj; j++) {\n                            r[j] = +pa[j] + (j % 2 ? x : y);\n                        }\n                }\n            } else if (pa0 == \"R\") {\n                dots = [x, y].concat(pa.slice(1));\n                res.pop();\n                res = res.concat(catmullRom2bezier(dots, crz));\n                r = [\"R\"].concat(pa.slice(-2));\n            } else if (pa0 == \"O\") {\n                res.pop();\n                dots = ellipsePath(x, y, pa[1], pa[2]);\n                dots.push(dots[0]);\n                res = res.concat(dots);\n            } else if (pa0 == \"U\") {\n                res.pop();\n                res = res.concat(ellipsePath(x, y, pa[1], pa[2], pa[3]));\n                r = [\"U\"].concat(res[res.length - 1].slice(-2));\n            } else {\n                for (var k = 0, kk = pa.length; k < kk; k++) {\n                    r[k] = pa[k];\n                }\n            }\n            pa0 = pa0.toUpperCase();\n            if (pa0 != \"O\") {\n                switch (r[0]) {\n                    case \"Z\":\n                        x = +mx;\n                        y = +my;\n                        break;\n                    case \"H\":\n                        x = r[1];\n                        break;\n                    case \"V\":\n                        y = r[1];\n                        break;\n                    case \"M\":\n                        mx = r[r.length - 2];\n                        my = r[r.length - 1];\n                    default:\n                        x = r[r.length - 2];\n                        y = r[r.length - 1];\n                }\n            }\n        }\n        res.toString = toString;\n        pth.abs = pathClone(res);\n        return res;\n    }\n    function l2c(x1, y1, x2, y2) {\n        return [x1, y1, x2, y2, x2, y2];\n    }\n    function q2c(x1, y1, ax, ay, x2, y2) {\n        var _13 = 1 / 3,\n            _23 = 2 / 3;\n        return [\n                _13 * x1 + _23 * ax,\n                _13 * y1 + _23 * ay,\n                _13 * x2 + _23 * ax,\n                _13 * y2 + _23 * ay,\n                x2,\n                y2\n            ];\n    }\n    function a2c(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {\n        // for more information of where this math came from visit:\n        // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n        var _120 = PI * 120 / 180,\n            rad = PI / 180 * (+angle || 0),\n            res = [],\n            xy,\n            rotate = Snap._.cacher(function (x, y, rad) {\n                var X = x * math.cos(rad) - y * math.sin(rad),\n                    Y = x * math.sin(rad) + y * math.cos(rad);\n                return {x: X, y: Y};\n            });\n        if (!rx || !ry) {\n            return [x1, y1, x2, y2, x2, y2];\n        }\n        if (!recursive) {\n            xy = rotate(x1, y1, -rad);\n            x1 = xy.x;\n            y1 = xy.y;\n            xy = rotate(x2, y2, -rad);\n            x2 = xy.x;\n            y2 = xy.y;\n            var cos = math.cos(PI / 180 * angle),\n                sin = math.sin(PI / 180 * angle),\n                x = (x1 - x2) / 2,\n                y = (y1 - y2) / 2;\n            var h = x * x / (rx * rx) + y * y / (ry * ry);\n            if (h > 1) {\n                h = math.sqrt(h);\n                rx = h * rx;\n                ry = h * ry;\n            }\n            var rx2 = rx * rx,\n                ry2 = ry * ry,\n                k = (large_arc_flag == sweep_flag ? -1 : 1) *\n                    math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),\n                cx = k * rx * y / ry + (x1 + x2) / 2,\n                cy = k * -ry * x / rx + (y1 + y2) / 2,\n                f1 = math.asin(((y1 - cy) / ry).toFixed(9)),\n                f2 = math.asin(((y2 - cy) / ry).toFixed(9));\n\n            f1 = x1 < cx ? PI - f1 : f1;\n            f2 = x2 < cx ? PI - f2 : f2;\n            f1 < 0 && (f1 = PI * 2 + f1);\n            f2 < 0 && (f2 = PI * 2 + f2);\n            if (sweep_flag && f1 > f2) {\n                f1 = f1 - PI * 2;\n            }\n            if (!sweep_flag && f2 > f1) {\n                f2 = f2 - PI * 2;\n            }\n        } else {\n            f1 = recursive[0];\n            f2 = recursive[1];\n            cx = recursive[2];\n            cy = recursive[3];\n        }\n        var df = f2 - f1;\n        if (abs(df) > _120) {\n            var f2old = f2,\n                x2old = x2,\n                y2old = y2;\n            f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);\n            x2 = cx + rx * math.cos(f2);\n            y2 = cy + ry * math.sin(f2);\n            res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);\n        }\n        df = f2 - f1;\n        var c1 = math.cos(f1),\n            s1 = math.sin(f1),\n            c2 = math.cos(f2),\n            s2 = math.sin(f2),\n            t = math.tan(df / 4),\n            hx = 4 / 3 * rx * t,\n            hy = 4 / 3 * ry * t,\n            m1 = [x1, y1],\n            m2 = [x1 + hx * s1, y1 - hy * c1],\n            m3 = [x2 + hx * s2, y2 - hy * c2],\n            m4 = [x2, y2];\n        m2[0] = 2 * m1[0] - m2[0];\n        m2[1] = 2 * m1[1] - m2[1];\n        if (recursive) {\n            return [m2, m3, m4].concat(res);\n        } else {\n            res = [m2, m3, m4].concat(res).join().split(\",\");\n            var newres = [];\n            for (var i = 0, ii = res.length; i < ii; i++) {\n                newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;\n            }\n            return newres;\n        }\n    }\n    function findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {\n        var t1 = 1 - t;\n        return {\n            x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,\n            y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y\n        };\n    }\n\n    // Returns bounding box of cubic bezier curve.\n    // Source: http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n    // Original version: NISHIO Hirokazu\n    // Modifications: https://github.com/timo22345\n    function curveDim(x0, y0, x1, y1, x2, y2, x3, y3) {\n        var tvalues = [],\n            bounds = [[], []],\n            a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n        for (var i = 0; i < 2; ++i) {\n            if (i == 0) {\n                b = 6 * x0 - 12 * x1 + 6 * x2;\n                a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n                c = 3 * x1 - 3 * x0;\n            } else {\n                b = 6 * y0 - 12 * y1 + 6 * y2;\n                a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n                c = 3 * y1 - 3 * y0;\n            }\n            if (abs(a) < 1e-12) {\n                if (abs(b) < 1e-12) {\n                    continue;\n                }\n                t = -c / b;\n                if (0 < t && t < 1) {\n                    tvalues.push(t);\n                }\n                continue;\n            }\n            b2ac = b * b - 4 * c * a;\n            sqrtb2ac = math.sqrt(b2ac);\n            if (b2ac < 0) {\n                continue;\n            }\n            t1 = (-b + sqrtb2ac) / (2 * a);\n            if (0 < t1 && t1 < 1) {\n                tvalues.push(t1);\n            }\n            t2 = (-b - sqrtb2ac) / (2 * a);\n            if (0 < t2 && t2 < 1) {\n                tvalues.push(t2);\n            }\n        }\n\n        var x, y, j = tvalues.length,\n            jlen = j,\n            mt;\n        while (j--) {\n            t = tvalues[j];\n            mt = 1 - t;\n            bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3;\n            bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3;\n        }\n\n        bounds[0][jlen] = x0;\n        bounds[1][jlen] = y0;\n        bounds[0][jlen + 1] = x3;\n        bounds[1][jlen + 1] = y3;\n        bounds[0].length = bounds[1].length = jlen + 2;\n\n\n        return {\n          min: {x: mmin.apply(0, bounds[0]), y: mmin.apply(0, bounds[1])},\n          max: {x: mmax.apply(0, bounds[0]), y: mmax.apply(0, bounds[1])}\n        };\n    }\n\n    function path2curve(path, path2) {\n        var pth = !path2 && paths(path);\n        if (!path2 && pth.curve) {\n            return pathClone(pth.curve);\n        }\n        var p = pathToAbsolute(path),\n            p2 = path2 && pathToAbsolute(path2),\n            attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},\n            processPath = function (path, d, pcom) {\n                var nx, ny;\n                if (!path) {\n                    return [\"C\", d.x, d.y, d.x, d.y, d.x, d.y];\n                }\n                !(path[0] in {T: 1, Q: 1}) && (d.qx = d.qy = null);\n                switch (path[0]) {\n                    case \"M\":\n                        d.X = path[1];\n                        d.Y = path[2];\n                        break;\n                    case \"A\":\n                        path = [\"C\"].concat(a2c.apply(0, [d.x, d.y].concat(path.slice(1))));\n                        break;\n                    case \"S\":\n                        if (pcom == \"C\" || pcom == \"S\") { // In \"S\" case we have to take into account, if the previous command is C/S.\n                            nx = d.x * 2 - d.bx;          // And reflect the previous\n                            ny = d.y * 2 - d.by;          // command's control point relative to the current point.\n                        }\n                        else {                            // or some else or nothing\n                            nx = d.x;\n                            ny = d.y;\n                        }\n                        path = [\"C\", nx, ny].concat(path.slice(1));\n                        break;\n                    case \"T\":\n                        if (pcom == \"Q\" || pcom == \"T\") { // In \"T\" case we have to take into account, if the previous command is Q/T.\n                            d.qx = d.x * 2 - d.qx;        // And make a reflection similar\n                            d.qy = d.y * 2 - d.qy;        // to case \"S\".\n                        }\n                        else {                            // or something else or nothing\n                            d.qx = d.x;\n                            d.qy = d.y;\n                        }\n                        path = [\"C\"].concat(q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));\n                        break;\n                    case \"Q\":\n                        d.qx = path[1];\n                        d.qy = path[2];\n                        path = [\"C\"].concat(q2c(d.x, d.y, path[1], path[2], path[3], path[4]));\n                        break;\n                    case \"L\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], path[2]));\n                        break;\n                    case \"H\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, path[1], d.y));\n                        break;\n                    case \"V\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.x, path[1]));\n                        break;\n                    case \"Z\":\n                        path = [\"C\"].concat(l2c(d.x, d.y, d.X, d.Y));\n                        break;\n                }\n                return path;\n            },\n            fixArc = function (pp, i) {\n                if (pp[i].length > 7) {\n                    pp[i].shift();\n                    var pi = pp[i];\n                    while (pi.length) {\n                        pcoms1[i] = \"A\"; // if created multiple C:s, their original seg is saved\n                        p2 && (pcoms2[i] = \"A\"); // the same as above\n                        pp.splice(i++, 0, [\"C\"].concat(pi.splice(0, 6)));\n                    }\n                    pp.splice(i, 1);\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            fixM = function (path1, path2, a1, a2, i) {\n                if (path1 && path2 && path1[i][0] == \"M\" && path2[i][0] != \"M\") {\n                    path2.splice(i, 0, [\"M\", a2.x, a2.y]);\n                    a1.bx = 0;\n                    a1.by = 0;\n                    a1.x = path1[i][1];\n                    a1.y = path1[i][2];\n                    ii = mmax(p.length, p2 && p2.length || 0);\n                }\n            },\n            pcoms1 = [], // path commands of original path p\n            pcoms2 = [], // path commands of original path p2\n            pfirst = \"\", // temporary holder for original path command\n            pcom = \"\"; // holder for previous path command of original path\n        for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {\n            p[i] && (pfirst = p[i][0]); // save current path command\n\n            if (pfirst != \"C\") // C is not saved yet, because it may be result of conversion\n            {\n                pcoms1[i] = pfirst; // Save current path command\n                i && ( pcom = pcoms1[i - 1]); // Get previous path command pcom\n            }\n            p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath\n\n            if (pcoms1[i] != \"A\" && pfirst == \"C\") pcoms1[i] = \"C\"; // A is the only command\n            // which may produce multiple C:s\n            // so we have to make sure that C is also C in original path\n\n            fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1\n\n            if (p2) { // the same procedures is done to p2\n                p2[i] && (pfirst = p2[i][0]);\n                if (pfirst != \"C\") {\n                    pcoms2[i] = pfirst;\n                    i && (pcom = pcoms2[i - 1]);\n                }\n                p2[i] = processPath(p2[i], attrs2, pcom);\n\n                if (pcoms2[i] != \"A\" && pfirst == \"C\") {\n                    pcoms2[i] = \"C\";\n                }\n\n                fixArc(p2, i);\n            }\n            fixM(p, p2, attrs, attrs2, i);\n            fixM(p2, p, attrs2, attrs, i);\n            var seg = p[i],\n                seg2 = p2 && p2[i],\n                seglen = seg.length,\n                seg2len = p2 && seg2.length;\n            attrs.x = seg[seglen - 2];\n            attrs.y = seg[seglen - 1];\n            attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;\n            attrs.by = toFloat(seg[seglen - 3]) || attrs.y;\n            attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);\n            attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);\n            attrs2.x = p2 && seg2[seg2len - 2];\n            attrs2.y = p2 && seg2[seg2len - 1];\n        }\n        if (!p2) {\n            pth.curve = pathClone(p);\n        }\n        return p2 ? [p, p2] : p;\n    }\n    function mapPath(path, matrix) {\n        if (!matrix) {\n            return path;\n        }\n        var x, y, i, j, ii, jj, pathi;\n        path = path2curve(path);\n        for (i = 0, ii = path.length; i < ii; i++) {\n            pathi = path[i];\n            for (j = 1, jj = pathi.length; j < jj; j += 2) {\n                x = matrix.x(pathi[j], pathi[j + 1]);\n                y = matrix.y(pathi[j], pathi[j + 1]);\n                pathi[j] = x;\n                pathi[j + 1] = y;\n            }\n        }\n        return path;\n    }\n\n    // http://schepers.cc/getting-to-the-point\n    function catmullRom2bezier(crp, z) {\n        var d = [];\n        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {\n            var p = [\n                        {x: +crp[i - 2], y: +crp[i - 1]},\n                        {x: +crp[i],     y: +crp[i + 1]},\n                        {x: +crp[i + 2], y: +crp[i + 3]},\n                        {x: +crp[i + 4], y: +crp[i + 5]}\n                    ];\n            if (z) {\n                if (!i) {\n                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};\n                } else if (iLen - 4 == i) {\n                    p[3] = {x: +crp[0], y: +crp[1]};\n                } else if (iLen - 2 == i) {\n                    p[2] = {x: +crp[0], y: +crp[1]};\n                    p[3] = {x: +crp[2], y: +crp[3]};\n                }\n            } else {\n                if (iLen - 4 == i) {\n                    p[3] = p[2];\n                } else if (!i) {\n                    p[0] = {x: +crp[i], y: +crp[i + 1]};\n                }\n            }\n            d.push([\"C\",\n                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,\n                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,\n                  (p[1].x + 6 * p[2].x - p[3].x) / 6,\n                  (p[1].y + 6*p[2].y - p[3].y) / 6,\n                  p[2].x,\n                  p[2].y\n            ]);\n        }\n\n        return d;\n    }\n\n    // export\n    Snap.path = paths;\n\n    /*\\\n     * Snap.path.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the given path in pixels\n     **\n     - path (string) SVG path string\n     **\n     = (number) length\n    \\*/\n    Snap.path.getTotalLength = getTotalLength;\n    /*\\\n     * Snap.path.getPointAtLength\n     [ method ]\n     **\n     * Returns the coordinates of the point located at the given length along the given path\n     **\n     - path (string) SVG path string\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    Snap.path.getPointAtLength = getPointAtLength;\n    /*\\\n     * Snap.path.getSubpath\n     [ method ]\n     **\n     * Returns the subpath of a given path between given start and end lengths\n     **\n     - path (string) SVG path string\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    Snap.path.getSubpath = function (path, from, to) {\n        if (this.getTotalLength(path) - to < 1e-6) {\n            return getSubpathsAtLength(path, from).end;\n        }\n        var a = getSubpathsAtLength(path, to, 1);\n        return from ? getSubpathsAtLength(a, from).end : a;\n    };\n    /*\\\n     * Element.getTotalLength\n     [ method ]\n     **\n     * Returns the length of the path in pixels (only works for `path` elements)\n     = (number) length\n    \\*/\n    elproto.getTotalLength = function () {\n        if (this.node.getTotalLength) {\n            return this.node.getTotalLength();\n        }\n    };\n    // SIERRA Element.getPointAtLength()/Element.getTotalLength(): If a <path> is broken into different segments, is the jump distance to the new coordinates set by the _M_ or _m_ commands calculated as part of the path's total length?\n    /*\\\n     * Element.getPointAtLength\n     [ method ]\n     **\n     * Returns coordinates of the point located at the given length on the given path (only works for `path` elements)\n     **\n     - length (number) length, in pixels, from the start of the path, excluding non-rendering jumps\n     **\n     = (object) representation of the point:\n     o {\n     o     x: (number) x coordinate,\n     o     y: (number) y coordinate,\n     o     alpha: (number) angle of derivative\n     o }\n    \\*/\n    elproto.getPointAtLength = function (length) {\n        return getPointAtLength(this.attr(\"d\"), length);\n    };\n    // SIERRA Element.getSubpath(): Similar to the problem for Element.getPointAtLength(). Unclear how this would work for a segmented path. Overall, the concept of _subpath_ and what I'm calling a _segment_ (series of non-_M_ or _Z_ commands) is unclear.\n    /*\\\n     * Element.getSubpath\n     [ method ]\n     **\n     * Returns subpath of a given element from given start and end lengths (only works for `path` elements)\n     **\n     - from (number) length, in pixels, from the start of the path to the start of the segment\n     - to (number) length, in pixels, from the start of the path to the end of the segment\n     **\n     = (string) path string definition for the segment\n    \\*/\n    elproto.getSubpath = function (from, to) {\n        return Snap.path.getSubpath(this.attr(\"d\"), from, to);\n    };\n    Snap._.box = box;\n    /*\\\n     * Snap.path.findDotsAtSegment\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds dot coordinates on the given cubic beziér curve at the given t\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     - t (number) position on the curve (0..1)\n     = (object) point information in format:\n     o {\n     o     x: (number) x coordinate of the point,\n     o     y: (number) y coordinate of the point,\n     o     m: {\n     o         x: (number) x coordinate of the left anchor,\n     o         y: (number) y coordinate of the left anchor\n     o     },\n     o     n: {\n     o         x: (number) x coordinate of the right anchor,\n     o         y: (number) y coordinate of the right anchor\n     o     },\n     o     start: {\n     o         x: (number) x coordinate of the start of the curve,\n     o         y: (number) y coordinate of the start of the curve\n     o     },\n     o     end: {\n     o         x: (number) x coordinate of the end of the curve,\n     o         y: (number) y coordinate of the end of the curve\n     o     },\n     o     alpha: (number) angle of the curve derivative at the point\n     o }\n    \\*/\n    Snap.path.findDotsAtSegment = findDotsAtSegment;\n    /*\\\n     * Snap.path.bezierBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given cubic beziér curve\n     - p1x (number) x of the first point of the curve\n     - p1y (number) y of the first point of the curve\n     - c1x (number) x of the first anchor of the curve\n     - c1y (number) y of the first anchor of the curve\n     - c2x (number) x of the second anchor of the curve\n     - c2y (number) y of the second anchor of the curve\n     - p2x (number) x of the second point of the curve\n     - p2y (number) y of the second point of the curve\n     * or\n     - bez (array) array of six points for beziér curve\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.bezierBBox = bezierBBox;\n    /*\\\n     * Snap.path.isPointInsideBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside bounding box\n     - bbox (string) bounding box\n     - x (string) x coordinate of the point\n     - y (string) y coordinate of the point\n     = (boolean) `true` if point is inside\n    \\*/\n    Snap.path.isPointInsideBBox = isPointInsideBBox;\n    Snap.closest = function (x, y, X, Y) {\n        var r = 100,\n            b = box(x - r / 2, y - r / 2, r, r),\n            inside = [],\n            getter = X[0].hasOwnProperty(\"x\") ? function (i) {\n                return {\n                    x: X[i].x,\n                    y: X[i].y\n                };\n            } : function (i) {\n                return {\n                    x: X[i],\n                    y: Y[i]\n                };\n            },\n            found = 0;\n        while (r <= 1e6 && !found) {\n            for (var i = 0, ii = X.length; i < ii; i++) {\n                var xy = getter(i);\n                if (isPointInsideBBox(b, xy.x, xy.y)) {\n                    found++;\n                    inside.push(xy);\n                    break;\n                }\n            }\n            if (!found) {\n                r *= 2;\n                b = box(x - r / 2, y - r / 2, r, r)\n            }\n        }\n        if (r == 1e6) {\n            return;\n        }\n        var len = Infinity,\n            res;\n        for (i = 0, ii = inside.length; i < ii; i++) {\n            var l = Snap.len(x, y, inside[i].x, inside[i].y);\n            if (len > l) {\n                len = l;\n                inside[i].len = l;\n                res = inside[i];\n            }\n        }\n        return res;\n    };\n    /*\\\n     * Snap.path.isBBoxIntersect\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if two bounding boxes intersect\n     - bbox1 (string) first bounding box\n     - bbox2 (string) second bounding box\n     = (boolean) `true` if bounding boxes intersect\n    \\*/\n    Snap.path.isBBoxIntersect = isBBoxIntersect;\n    /*\\\n     * Snap.path.intersection\n     [ method ]\n     **\n     * Utility method\n     **\n     * Finds intersections of two paths\n     - path1 (string) path string\n     - path2 (string) path string\n     = (array) dots of intersection\n     o [\n     o     {\n     o         x: (number) x coordinate of the point,\n     o         y: (number) y coordinate of the point,\n     o         t1: (number) t value for segment of path1,\n     o         t2: (number) t value for segment of path2,\n     o         segment1: (number) order number for segment of path1,\n     o         segment2: (number) order number for segment of path2,\n     o         bez1: (array) eight coordinates representing beziér curve for the segment of path1,\n     o         bez2: (array) eight coordinates representing beziér curve for the segment of path2\n     o     }\n     o ]\n    \\*/\n    Snap.path.intersection = pathIntersection;\n    Snap.path.intersectionNumber = pathIntersectionNumber;\n    /*\\\n     * Snap.path.isPointInside\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns `true` if given point is inside a given closed path.\n     *\n     * Note: fill mode doesn’t affect the result of this method.\n     - path (string) path string\n     - x (number) x of the point\n     - y (number) y of the point\n     = (boolean) `true` if point is inside the path\n    \\*/\n    Snap.path.isPointInside = isPointInsidePath;\n    /*\\\n     * Snap.path.getBBox\n     [ method ]\n     **\n     * Utility method\n     **\n     * Returns the bounding box of a given path\n     - path (string) path string\n     = (object) bounding box\n     o {\n     o     x: (number) x coordinate of the left top point of the box,\n     o     y: (number) y coordinate of the left top point of the box,\n     o     x2: (number) x coordinate of the right bottom point of the box,\n     o     y2: (number) y coordinate of the right bottom point of the box,\n     o     width: (number) width of the box,\n     o     height: (number) height of the box\n     o }\n    \\*/\n    Snap.path.getBBox = pathBBox;\n    Snap.path.get = getPath;\n    /*\\\n     * Snap.path.toRelative\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into relative values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toRelative = pathToRelative;\n    /*\\\n     * Snap.path.toAbsolute\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path coordinates into absolute values\n     - path (string) path string\n     = (array) path string\n    \\*/\n    Snap.path.toAbsolute = pathToAbsolute;\n    /*\\\n     * Snap.path.toCubic\n     [ method ]\n     **\n     * Utility method\n     **\n     * Converts path to a new path where all segments are cubic beziér curves\n     - pathString (string|array) path string or array of segments\n     = (array) array of segments\n    \\*/\n    Snap.path.toCubic = path2curve;\n    /*\\\n     * Snap.path.map\n     [ method ]\n     **\n     * Transform the path string with the given matrix\n     - path (string) path string\n     - matrix (object) see @Matrix\n     = (string) transformed path string\n    \\*/\n    Snap.path.map = mapPath;\n    Snap.path.toString = toString;\n    Snap.path.clone = pathClone;\n});\n"
  },
  {
    "path": "src/set.js",
    "content": "// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nSnap.plugin(function (Snap, Element, Paper, glob) {\n    var mmax = Math.max,\n        mmin = Math.min;\n\n    // Set\n    var Set = function (items) {\n        this.items = [];\n\tthis.bindings = {};\n        this.length = 0;\n        this.type = \"set\";\n        if (items) {\n            for (var i = 0, ii = items.length; i < ii; i++) {\n                if (items[i]) {\n                    this[this.items.length] = this.items[this.items.length] = items[i];\n                    this.length++;\n                }\n            }\n        }\n    },\n    setproto = Set.prototype;\n    /*\\\n     * Set.push\n     [ method ]\n     **\n     * Adds each argument to the current set\n     = (object) original element\n    \\*/\n    setproto.push = function () {\n        var item,\n            len;\n        for (var i = 0, ii = arguments.length; i < ii; i++) {\n            item = arguments[i];\n            if (item) {\n                len = this.items.length;\n                this[len] = this.items[len] = item;\n                this.length++;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.pop\n     [ method ]\n     **\n     * Removes last element and returns it\n     = (object) element\n    \\*/\n    setproto.pop = function () {\n        this.length && delete this[this.length--];\n        return this.items.pop();\n    };\n    /*\\\n     * Set.forEach\n     [ method ]\n     **\n     * Executes given function for each element in the set\n     *\n     * If the function returns `false`, the loop stops running.\n     **\n     - callback (function) function to run\n     - thisArg (object) context object for the callback\n     = (object) Set object\n    \\*/\n    setproto.forEach = function (callback, thisArg) {\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            if (callback.call(thisArg, this.items[i], i) === false) {\n                return this;\n            }\n        }\n        return this;\n    };\n    /*\\\n     * Set.animate\n     [ method ]\n     **\n     * Animates each element in set in sync.\n     *\n     **\n     - attrs (object) key-value pairs of destination attributes\n     - duration (number) duration of the animation in milliseconds\n     - easing (function) #optional easing function from @mina or custom\n     - callback (function) #optional callback function that executes when the animation ends\n     * or\n     - animation (array) array of animation parameter for each element in set in format `[attrs, duration, easing, callback]`\n     > Usage\n     | // animate all elements in set to radius 10\n     | set.animate({r: 10}, 500, mina.easein);\n     | // or\n     | // animate first element to radius 10, but second to radius 20 and in different time\n     | set.animate([{r: 10}, 500, mina.easein], [{r: 20}, 1500, mina.easein]);\n     = (Element) the current element\n    \\*/\n    setproto.animate = function (attrs, ms, easing, callback) {\n        if (typeof easing == \"function\" && !easing.length) {\n            callback = easing;\n            easing = mina.linear;\n        }\n        if (attrs instanceof Snap._.Animation) {\n            callback = attrs.callback;\n            easing = attrs.easing;\n            ms = easing.dur;\n            attrs = attrs.attr;\n        }\n        var args = arguments;\n        if (Snap.is(attrs, \"array\") && Snap.is(args[args.length - 1], \"array\")) {\n            var each = true;\n        }\n        var begin,\n            handler = function () {\n                if (begin) {\n                    this.b = begin;\n                } else {\n                    begin = this.b;\n                }\n            },\n            cb = 0,\n            set = this,\n            callbacker = callback && function () {\n                if (++cb == set.length) {\n                    callback.call(this);\n                }\n            };\n        return this.forEach(function (el, i) {\n            eve.once(\"snap.animcreated.\" + el.id, handler);\n            if (each) {\n                args[i] && el.animate.apply(el, args[i]);\n            } else {\n                el.animate(attrs, ms, easing, callbacker);\n            }\n        });\n    };\n    /*\\\n     * Set.remove\n     [ method ]\n     **\n     * Removes all children of the set.\n     *\n     = (object) Set object\n    \\*/\n    setproto.remove = function () {\n        while (this.length) {\n            this.pop().remove();\n        }\n        return this;\n    };\n    /*\\\n     * Set.bind\n     [ method ]\n     **\n     * Specifies how to handle a specific attribute when applied\n     * to a set.\n     *\n     **\n     - attr (string) attribute name\n     - callback (function) function to run\n     * or\n     - attr (string) attribute name\n     - element (Element) specific element in the set to apply the attribute to\n     * or\n     - attr (string) attribute name\n     - element (Element) specific element in the set to apply the attribute to\n     - eattr (string) attribute on the element to bind the attribute to\n     = (object) Set object\n    \\*/\n    setproto.bind = function (attr, a, b) {\n        var data = {};\n        if (typeof a == \"function\") {\n            this.bindings[attr] = a;\n        } else {\n            var aname = b || attr;\n            this.bindings[attr] = function (v) {\n                data[aname] = v;\n                a.attr(data);\n            };\n        }\n        return this;\n    };\n    /*\\\n     * Set.attr\n     [ method ]\n     **\n     * Equivalent of @Element.attr.\n     = (object) Set object\n    \\*/\n    setproto.attr = function (value) {\n        var unbound = {};\n        for (var k in value) {\n            if (this.bindings[k]) {\n                this.bindings[k](value[k]);\n            } else {\n                unbound[k] = value[k];\n            }\n        }\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            this.items[i].attr(unbound);\n        }\n        return this;\n    };\n    /*\\\n     * Set.clear\n     [ method ]\n     **\n     * Removes all elements from the set\n    \\*/\n    setproto.clear = function () {\n        while (this.length) {\n            this.pop();\n        }\n    };\n    /*\\\n     * Set.splice\n     [ method ]\n     **\n     * Removes range of elements from the set\n     **\n     - index (number) position of the deletion\n     - count (number) number of element to remove\n     - insertion… (object) #optional elements to insert\n     = (object) set elements that were deleted\n    \\*/\n    setproto.splice = function (index, count, insertion) {\n        index = index < 0 ? mmax(this.length + index, 0) : index;\n        count = mmax(0, mmin(this.length - index, count));\n        var tail = [],\n            todel = [],\n            args = [],\n            i;\n        for (i = 2; i < arguments.length; i++) {\n            args.push(arguments[i]);\n        }\n        for (i = 0; i < count; i++) {\n            todel.push(this[index + i]);\n        }\n        for (; i < this.length - index; i++) {\n            tail.push(this[index + i]);\n        }\n        var arglen = args.length;\n        for (i = 0; i < arglen + tail.length; i++) {\n            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];\n        }\n        i = this.items.length = this.length -= count - arglen;\n        while (this[i]) {\n            delete this[i++];\n        }\n        return new Set(todel);\n    };\n    /*\\\n     * Set.exclude\n     [ method ]\n     **\n     * Removes given element from the set\n     **\n     - element (object) element to remove\n     = (boolean) `true` if object was found and removed from the set\n    \\*/\n    setproto.exclude = function (el) {\n        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {\n            this.splice(i, 1);\n            return true;\n        }\n        return false;\n    };\n    /*\\\n     * Set.insertAfter\n     [ method ]\n     **\n     * Inserts set elements after given element.\n     **\n     - element (object) set will be inserted after this element\n     = (object) Set object\n    \\*/\n    setproto.insertAfter = function (el) {\n        var i = this.items.length;\n        while (i--) {\n            this.items[i].insertAfter(el);\n        }\n        return this;\n    };\n    /*\\\n     * Set.getBBox\n     [ method ]\n     **\n     * Union of all bboxes of the set. See @Element.getBBox.\n     = (object) bounding box descriptor. See @Element.getBBox.\n    \\*/\n    setproto.getBBox = function () {\n        var x = [],\n            y = [],\n            x2 = [],\n            y2 = [];\n        for (var i = this.items.length; i--;) if (!this.items[i].removed) {\n            var box = this.items[i].getBBox();\n            x.push(box.x);\n            y.push(box.y);\n            x2.push(box.x + box.width);\n            y2.push(box.y + box.height);\n        }\n        x = mmin.apply(0, x);\n        y = mmin.apply(0, y);\n        x2 = mmax.apply(0, x2);\n        y2 = mmax.apply(0, y2);\n        return {\n            x: x,\n            y: y,\n            x2: x2,\n            y2: y2,\n            width: x2 - x,\n            height: y2 - y,\n            cx: x + (x2 - x) / 2,\n            cy: y + (y2 - y) / 2\n        };\n    };\n    /*\\\n     * Set.insertAfter\n     [ method ]\n     **\n     * Creates a clone of the set.\n     **\n     = (object) New Set object\n    \\*/\n    setproto.clone = function (s) {\n        s = new Set;\n        for (var i = 0, ii = this.items.length; i < ii; i++) {\n            s.push(this.items[i].clone());\n        }\n        return s;\n    };\n    setproto.toString = function () {\n        return \"Snap\\u2018s set\";\n    };\n    setproto.type = \"set\";\n    // export\n    /*\\\n     * Snap.Set\n     [ property ]\n     **\n     * Set constructor.\n    \\*/\n    Snap.Set = Set;\n    /*\\\n     * Snap.set\n     [ method ]\n     **\n     * Creates a set and fills it with list of arguments.\n     **\n     = (object) New Set object\n     | var r = paper.rect(0, 0, 10, 10),\n     |     s1 = Snap.set(), // empty set\n     |     s2 = Snap.set(r, paper.circle(100, 100, 20)); // prefilled set\n    \\*/\n    Snap.set = function () {\n        var set = new Set;\n        if (arguments.length) {\n            set.push.apply(set, Array.prototype.slice.call(arguments, 0));\n        }\n        return set;\n    };\n});\n"
  },
  {
    "path": "src/svg.js",
    "content": "// Copyright (c) 2013 - 2017 Adobe Systems Incorporated. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nvar Snap = (function(root) {\nSnap.version = \"0.5.1\";\n/*\\\n * Snap\n [ method ]\n **\n * Creates a drawing surface or wraps existing SVG element.\n **\n - width (number|string) width of surface\n - height (number|string) height of surface\n * or\n - DOM (SVGElement) element to be wrapped into Snap structure\n * or\n - array (array) array of elements (will return set of elements)\n * or\n - query (string) CSS query selector\n = (object) @Element\n\\*/\nfunction Snap(w, h) {\n    if (w) {\n        if (w.nodeType) {\n            return wrap(w);\n        }\n        if (is(w, \"array\") && Snap.set) {\n            return Snap.set.apply(Snap, w);\n        }\n        if (w instanceof Element) {\n            return w;\n        }\n        if (h == null) {\n            try {\n                w = glob.doc.querySelector(String(w));\n                return wrap(w);\n            } catch (e) {\n                return null;\n            }\n        }\n    }\n    w = w == null ? \"100%\" : w;\n    h = h == null ? \"100%\" : h;\n    return new Paper(w, h);\n}\nSnap.toString = function () {\n    return \"Snap v\" + this.version;\n};\nSnap._ = {};\nvar glob = {\n    win: root.window,\n    doc: root.window.document\n};\nSnap._.glob = glob;\nvar has = \"hasOwnProperty\",\n    Str = String,\n    toFloat = parseFloat,\n    toInt = parseInt,\n    math = Math,\n    mmax = math.max,\n    mmin = math.min,\n    abs = math.abs,\n    pow = math.pow,\n    PI = math.PI,\n    round = math.round,\n    E = \"\",\n    S = \" \",\n    objectToString = Object.prototype.toString,\n    ISURL = /^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,\n    colourRegExp = /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?%?)\\s*\\))\\s*$/i,\n    bezierrg = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,\n    separator = Snap._.separator = /[,\\s]+/,\n    whitespace = /[\\s]/g,\n    commaSpaces = /[\\s]*,[\\s]*/,\n    hsrg = {hs: 1, rg: 1},\n    pathCommand = /([a-z])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n    tCommand = /([rstm])[\\s,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\s]*,?[\\s]*)+)/ig,\n    pathValues = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\s]*,?[\\s]*/ig,\n    idgen = 0,\n    idprefix = \"S\" + (+new Date).toString(36),\n    ID = function (el) {\n        return (el && el.type ? el.type : E) + idprefix + (idgen++).toString(36);\n    },\n    xlink = \"http://www.w3.org/1999/xlink\",\n    xmlns = \"http://www.w3.org/2000/svg\",\n    hub = {},\n    /*\\\n     * Snap.url\n     [ method ]\n     **\n     * Wraps path into `\"url('<path>')\"`.\n     - value (string) path\n     = (string) wrapped path\n    \\*/\n    URL = Snap.url = function (url) {\n        return \"url('#\" + url + \"')\";\n    };\n\nfunction $(el, attr) {\n    if (attr) {\n        if (el == \"#text\") {\n            el = glob.doc.createTextNode(attr.text || attr[\"#text\"] || \"\");\n        }\n        if (el == \"#comment\") {\n            el = glob.doc.createComment(attr.text || attr[\"#text\"] || \"\");\n        }\n        if (typeof el == \"string\") {\n            el = $(el);\n        }\n        if (typeof attr == \"string\") {\n            if (el.nodeType == 1) {\n                if (attr.substring(0, 6) == \"xlink:\") {\n                    return el.getAttributeNS(xlink, attr.substring(6));\n                }\n                if (attr.substring(0, 4) == \"xml:\") {\n                    return el.getAttributeNS(xmlns, attr.substring(4));\n                }\n                return el.getAttribute(attr);\n            } else if (attr == \"text\") {\n                return el.nodeValue;\n            } else {\n                return null;\n            }\n        }\n        if (el.nodeType == 1) {\n            for (var key in attr) if (attr[has](key)) {\n                var val = Str(attr[key]);\n                if (val) {\n                    if (key.substring(0, 6) == \"xlink:\") {\n                        el.setAttributeNS(xlink, key.substring(6), val);\n                    } else if (key.substring(0, 4) == \"xml:\") {\n                        el.setAttributeNS(xmlns, key.substring(4), val);\n                    } else {\n                        el.setAttribute(key, val);\n                    }\n                } else {\n                    el.removeAttribute(key);\n                }\n            }\n        } else if (\"text\" in attr) {\n            el.nodeValue = attr.text;\n        }\n    } else {\n        el = glob.doc.createElementNS(xmlns, el);\n    }\n    return el;\n}\nSnap._.$ = $;\nSnap._.id = ID;\nfunction getAttrs(el) {\n    var attrs = el.attributes,\n        name,\n        out = {};\n    for (var i = 0; i < attrs.length; i++) {\n        if (attrs[i].namespaceURI == xlink) {\n            name = \"xlink:\";\n        } else {\n            name = \"\";\n        }\n        name += attrs[i].name;\n        out[name] = attrs[i].textContent;\n    }\n    return out;\n}\nfunction is(o, type) {\n    type = Str.prototype.toLowerCase.call(type);\n    if (type == \"finite\") {\n        return isFinite(o);\n    }\n    if (type == \"array\" &&\n        (o instanceof Array || Array.isArray && Array.isArray(o))) {\n        return true;\n    }\n    return  type == \"null\" && o === null ||\n            type == typeof o && o !== null ||\n            type == \"object\" && o === Object(o) ||\n            objectToString.call(o).slice(8, -1).toLowerCase() == type;\n}\n/*\\\n * Snap.format\n [ method ]\n **\n * Replaces construction of type `{<name>}` to the corresponding argument\n **\n - token (string) string to format\n - json (object) object which properties are used as a replacement\n = (string) formatted string\n > Usage\n | // this draws a rectangular shape equivalent to \"M10,20h40v50h-40z\"\n | paper.path(Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n |     x: 10,\n |     y: 20,\n |     dim: {\n |         width: 40,\n |         height: 50,\n |         \"negative width\": -40\n |     }\n | }));\n\\*/\nSnap.format = (function () {\n    var tokenRegex = /\\{([^\\}]+)\\}/g,\n        objNotationRegex = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, // matches .xxxxx or [\"xxxxx\"] to run over object properties\n        replacer = function (all, key, obj) {\n            var res = obj;\n            key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {\n                name = name || quotedName;\n                if (res) {\n                    if (name in res) {\n                        res = res[name];\n                    }\n                    typeof res == \"function\" && isFunc && (res = res());\n                }\n            });\n            res = (res == null || res == obj ? all : res) + \"\";\n            return res;\n        };\n    return function (str, obj) {\n        return Str(str).replace(tokenRegex, function (all, key) {\n            return replacer(all, key, obj);\n        });\n    };\n})();\nfunction clone(obj) {\n    if (typeof obj == \"function\" || Object(obj) !== obj) {\n        return obj;\n    }\n    var res = new obj.constructor;\n    for (var key in obj) if (obj[has](key)) {\n        res[key] = clone(obj[key]);\n    }\n    return res;\n}\nSnap._.clone = clone;\nfunction repush(array, item) {\n    for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {\n        return array.push(array.splice(i, 1)[0]);\n    }\n}\nfunction cacher(f, scope, postprocessor) {\n    function newf() {\n        var arg = Array.prototype.slice.call(arguments, 0),\n            args = arg.join(\"\\u2400\"),\n            cache = newf.cache = newf.cache || {},\n            count = newf.count = newf.count || [];\n        if (cache[has](args)) {\n            repush(count, args);\n            return postprocessor ? postprocessor(cache[args]) : cache[args];\n        }\n        count.length >= 1e3 && delete cache[count.shift()];\n        count.push(args);\n        cache[args] = f.apply(scope, arg);\n        return postprocessor ? postprocessor(cache[args]) : cache[args];\n    }\n    return newf;\n}\nSnap._.cacher = cacher;\nfunction angle(x1, y1, x2, y2, x3, y3) {\n    if (x3 == null) {\n        var x = x1 - x2,\n            y = y1 - y2;\n        if (!x && !y) {\n            return 0;\n        }\n        return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;\n    } else {\n        return angle(x1, y1, x3, y3) - angle(x2, y2, x3, y3);\n    }\n}\nfunction rad(deg) {\n    return deg % 360 * PI / 180;\n}\nfunction deg(rad) {\n    return rad * 180 / PI % 360;\n}\nfunction x_y() {\n    return this.x + S + this.y;\n}\nfunction x_y_w_h() {\n    return this.x + S + this.y + S + this.width + \" \\xd7 \" + this.height;\n}\n\n/*\\\n * Snap.rad\n [ method ]\n **\n * Transform angle to radians\n - deg (number) angle in degrees\n = (number) angle in radians\n\\*/\nSnap.rad = rad;\n/*\\\n * Snap.deg\n [ method ]\n **\n * Transform angle to degrees\n - rad (number) angle in radians\n = (number) angle in degrees\n\\*/\nSnap.deg = deg;\n/*\\\n * Snap.sin\n [ method ]\n **\n * Equivalent to `Math.sin()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) sin\n\\*/\nSnap.sin = function (angle) {\n    return math.sin(Snap.rad(angle));\n};\n/*\\\n * Snap.tan\n [ method ]\n **\n * Equivalent to `Math.tan()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) tan\n\\*/\nSnap.tan = function (angle) {\n    return math.tan(Snap.rad(angle));\n};\n/*\\\n * Snap.cos\n [ method ]\n **\n * Equivalent to `Math.cos()` only works with degrees, not radians.\n - angle (number) angle in degrees\n = (number) cos\n\\*/\nSnap.cos = function (angle) {\n    return math.cos(Snap.rad(angle));\n};\n/*\\\n * Snap.asin\n [ method ]\n **\n * Equivalent to `Math.asin()` only works with degrees, not radians.\n - num (number) value\n = (number) asin in degrees\n\\*/\nSnap.asin = function (num) {\n    return Snap.deg(math.asin(num));\n};\n/*\\\n * Snap.acos\n [ method ]\n **\n * Equivalent to `Math.acos()` only works with degrees, not radians.\n - num (number) value\n = (number) acos in degrees\n\\*/\nSnap.acos = function (num) {\n    return Snap.deg(math.acos(num));\n};\n/*\\\n * Snap.atan\n [ method ]\n **\n * Equivalent to `Math.atan()` only works with degrees, not radians.\n - num (number) value\n = (number) atan in degrees\n\\*/\nSnap.atan = function (num) {\n    return Snap.deg(math.atan(num));\n};\n/*\\\n * Snap.atan2\n [ method ]\n **\n * Equivalent to `Math.atan2()` only works with degrees, not radians.\n - x (number) value\n - y (number) value\n = (number) atan2 in degrees\n\\*/\nSnap.atan2 = function (x, y) {\n    return Snap.deg(math.atan2(x, y));\n};\n/*\\\n * Snap.angle\n [ method ]\n **\n * Returns an angle between two or three points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n - x3 (number) #optional x coord of third point\n - y3 (number) #optional y coord of third point\n = (number) angle in degrees\n\\*/\nSnap.angle = angle;\n/*\\\n * Snap.len\n [ method ]\n **\n * Returns distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len = function (x1, y1, x2, y2) {\n    return Math.sqrt(Snap.len2(x1, y1, x2, y2));\n};\n/*\\\n * Snap.len2\n [ method ]\n **\n * Returns squared distance between two points\n - x1 (number) x coord of first point\n - y1 (number) y coord of first point\n - x2 (number) x coord of second point\n - y2 (number) y coord of second point\n = (number) distance\n\\*/\nSnap.len2 = function (x1, y1, x2, y2) {\n    return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n};\n/*\\\n * Snap.closestPoint\n [ method ]\n **\n * Returns closest point to a given one on a given path.\n - path (Element) path element\n - x (number) x coord of a point\n - y (number) y coord of a point\n = (object) in format\n {\n    x (number) x coord of the point on the path\n    y (number) y coord of the point on the path\n    length (number) length of the path to the point\n    distance (number) distance from the given point to the path\n }\n\\*/\n// Copied from http://bl.ocks.org/mbostock/8027637\nSnap.closestPoint = function (path, x, y) {\n    function distance2(p) {\n        var dx = p.x - x,\n            dy = p.y - y;\n        return dx * dx + dy * dy;\n    }\n    var pathNode = path.node,\n        pathLength = pathNode.getTotalLength(),\n        precision = pathLength / pathNode.pathSegList.numberOfItems * .125,\n        best,\n        bestLength,\n        bestDistance = Infinity;\n\n    // linear scan for coarse approximation\n    for (var scan, scanLength = 0, scanDistance; scanLength <= pathLength; scanLength += precision) {\n        if ((scanDistance = distance2(scan = pathNode.getPointAtLength(scanLength))) < bestDistance) {\n            best = scan;\n            bestLength = scanLength;\n            bestDistance = scanDistance;\n        }\n    }\n\n    // binary search for precise estimate\n    precision *= .5;\n    while (precision > .5) {\n        var before,\n            after,\n            beforeLength,\n            afterLength,\n            beforeDistance,\n            afterDistance;\n        if ((beforeLength = bestLength - precision) >= 0 && (beforeDistance = distance2(before = pathNode.getPointAtLength(beforeLength))) < bestDistance) {\n            best = before;\n            bestLength = beforeLength;\n            bestDistance = beforeDistance;\n        } else if ((afterLength = bestLength + precision) <= pathLength && (afterDistance = distance2(after = pathNode.getPointAtLength(afterLength))) < bestDistance) {\n            best = after;\n            bestLength = afterLength;\n            bestDistance = afterDistance;\n        } else {\n            precision *= .5;\n        }\n    }\n\n    best = {\n        x: best.x,\n        y: best.y,\n        length: bestLength,\n        distance: Math.sqrt(bestDistance)\n    };\n    return best;\n}\n/*\\\n * Snap.is\n [ method ]\n **\n * Handy replacement for the `typeof` operator\n - o (…) any object or primitive\n - type (string) name of the type, e.g., `string`, `function`, `number`, etc.\n = (boolean) `true` if given value is of given type\n\\*/\nSnap.is = is;\n/*\\\n * Snap.snapTo\n [ method ]\n **\n * Snaps given value to given grid\n - values (array|number) given array of values or step of the grid\n - value (number) value to adjust\n - tolerance (number) #optional maximum distance to the target value that would trigger the snap. Default is `10`.\n = (number) adjusted value\n\\*/\nSnap.snapTo = function (values, value, tolerance) {\n    tolerance = is(tolerance, \"finite\") ? tolerance : 10;\n    if (is(values, \"array\")) {\n        var i = values.length;\n        while (i--) if (abs(values[i] - value) <= tolerance) {\n            return values[i];\n        }\n    } else {\n        values = +values;\n        var rem = value % values;\n        if (rem < tolerance) {\n            return value - rem;\n        }\n        if (rem > values - tolerance) {\n            return value - rem + values;\n        }\n    }\n    return value;\n};\n// Colour\n/*\\\n * Snap.getRGB\n [ method ]\n **\n * Parses color string as RGB object\n - color (string) color string in one of the following formats:\n # <ul>\n #     <li>Color name (<code>red</code>, <code>green</code>, <code>cornflowerblue</code>, etc)</li>\n #     <li>#••• — shortened HTML color: (<code>#000</code>, <code>#fc0</code>, etc.)</li>\n #     <li>#•••••• — full length HTML color: (<code>#000000</code>, <code>#bd2300</code>)</li>\n #     <li>rgb(•••, •••, •••) — red, green and blue channels values: (<code>rgb(200,&nbsp;100,&nbsp;0)</code>)</li>\n #     <li>rgba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>rgb(•••%, •••%, •••%) — same as above, but in %: (<code>rgb(100%,&nbsp;175%,&nbsp;0%)</code>)</li>\n #     <li>rgba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;1)</code>)</li>\n #     <li>hsba(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsb(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsba(•••%, •••%, •••%, •••%) — also with opacity</li>\n #     <li>hsl(•••, •••, •••) — hue, saturation and luminosity values: (<code>hsb(0.5,&nbsp;0.25,&nbsp;0.5)</code>)</li>\n #     <li>hsla(•••, •••, •••, •••) — also with opacity</li>\n #     <li>hsl(•••%, •••%, •••%) — same as above, but in %</li>\n #     <li>hsla(•••%, •••%, •••%, •••%) — also with opacity</li>\n # </ul>\n * Note that `%` can be used any time: `rgb(20%, 255, 50%)`.\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) true if string can't be parsed\n o }\n\\*/\nSnap.getRGB = cacher(function (colour) {\n    if (!colour || !!((colour = Str(colour)).indexOf(\"-\") + 1)) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    if (colour == \"none\") {\n        return {r: -1, g: -1, b: -1, hex: \"none\", toString: rgbtoString};\n    }\n    !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == \"#\") && (colour = toHex(colour));\n    if (!colour) {\n        return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n    }\n    var res,\n        red,\n        green,\n        blue,\n        opacity,\n        t,\n        values,\n        rgb = colour.match(colourRegExp);\n    if (rgb) {\n        if (rgb[2]) {\n            blue = toInt(rgb[2].substring(5), 16);\n            green = toInt(rgb[2].substring(3, 5), 16);\n            red = toInt(rgb[2].substring(1, 3), 16);\n        }\n        if (rgb[3]) {\n            blue = toInt((t = rgb[3].charAt(3)) + t, 16);\n            green = toInt((t = rgb[3].charAt(2)) + t, 16);\n            red = toInt((t = rgb[3].charAt(1)) + t, 16);\n        }\n        if (rgb[4]) {\n            values = rgb[4].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red *= 2.55);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green *= 2.55);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue *= 2.55);\n            rgb[1].toLowerCase().slice(0, 4) == \"rgba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n        }\n        if (rgb[5]) {\n            values = rgb[5].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsba\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsb2rgb(red, green, blue, opacity);\n        }\n        if (rgb[6]) {\n            values = rgb[6].split(commaSpaces);\n            red = toFloat(values[0]);\n            values[0].slice(-1) == \"%\" && (red /= 100);\n            green = toFloat(values[1]);\n            values[1].slice(-1) == \"%\" && (green /= 100);\n            blue = toFloat(values[2]);\n            values[2].slice(-1) == \"%\" && (blue /= 100);\n            (values[0].slice(-3) == \"deg\" || values[0].slice(-1) == \"\\xb0\") && (red /= 360);\n            rgb[1].toLowerCase().slice(0, 4) == \"hsla\" && (opacity = toFloat(values[3]));\n            values[3] && values[3].slice(-1) == \"%\" && (opacity /= 100);\n            return Snap.hsl2rgb(red, green, blue, opacity);\n        }\n        red = mmin(math.round(red), 255);\n        green = mmin(math.round(green), 255);\n        blue = mmin(math.round(blue), 255);\n        opacity = mmin(mmax(opacity, 0), 1);\n        rgb = {r: red, g: green, b: blue, toString: rgbtoString};\n        rgb.hex = \"#\" + (16777216 | blue | green << 8 | red << 16).toString(16).slice(1);\n        rgb.opacity = is(opacity, \"finite\") ? opacity : 1;\n        return rgb;\n    }\n    return {r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: rgbtoString};\n}, Snap);\n/*\\\n * Snap.hsb\n [ method ]\n **\n * Converts HSB values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - b (number) value or brightness\n = (string) hex representation of the color\n\\*/\nSnap.hsb = cacher(function (h, s, b) {\n    return Snap.hsb2rgb(h, s, b).hex;\n});\n/*\\\n * Snap.hsl\n [ method ]\n **\n * Converts HSL values to a hex representation of the color\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (string) hex representation of the color\n\\*/\nSnap.hsl = cacher(function (h, s, l) {\n    return Snap.hsl2rgb(h, s, l).hex;\n});\n/*\\\n * Snap.rgb\n [ method ]\n **\n * Converts RGB values to a hex representation of the color\n - r (number) red\n - g (number) green\n - b (number) blue\n = (string) hex representation of the color\n\\*/\nSnap.rgb = cacher(function (r, g, b, o) {\n    if (is(o, \"finite\")) {\n        var round = math.round;\n        return \"rgba(\" + [round(r), round(g), round(b), +o.toFixed(2)] + \")\";\n    }\n    return \"#\" + (16777216 | b | g << 8 | r << 16).toString(16).slice(1);\n});\nvar toHex = function (color) {\n    var i = glob.doc.getElementsByTagName(\"head\")[0] || glob.doc.getElementsByTagName(\"svg\")[0],\n        red = \"rgb(255, 0, 0)\";\n    toHex = cacher(function (color) {\n        if (color.toLowerCase() == \"red\") {\n            return red;\n        }\n        i.style.color = red;\n        i.style.color = color;\n        var out = glob.doc.defaultView.getComputedStyle(i, E).getPropertyValue(\"color\");\n        return out == red ? null : out;\n    });\n    return toHex(color);\n},\nhsbtoString = function () {\n    return \"hsb(\" + [this.h, this.s, this.b] + \")\";\n},\nhsltoString = function () {\n    return \"hsl(\" + [this.h, this.s, this.l] + \")\";\n},\nrgbtoString = function () {\n    return this.opacity == 1 || this.opacity == null ?\n            this.hex :\n            \"rgba(\" + [this.r, this.g, this.b, this.opacity] + \")\";\n},\nprepareRGB = function (r, g, b) {\n    if (g == null && is(r, \"object\") && \"r\" in r && \"g\" in r && \"b\" in r) {\n        b = r.b;\n        g = r.g;\n        r = r.r;\n    }\n    if (g == null && is(r, string)) {\n        var clr = Snap.getRGB(r);\n        r = clr.r;\n        g = clr.g;\n        b = clr.b;\n    }\n    if (r > 1 || g > 1 || b > 1) {\n        r /= 255;\n        g /= 255;\n        b /= 255;\n    }\n\n    return [r, g, b];\n},\npackageRGB = function (r, g, b, o) {\n    r = math.round(r * 255);\n    g = math.round(g * 255);\n    b = math.round(b * 255);\n    var rgb = {\n        r: r,\n        g: g,\n        b: b,\n        opacity: is(o, \"finite\") ? o : 1,\n        hex: Snap.rgb(r, g, b),\n        toString: rgbtoString\n    };\n    is(o, \"finite\") && (rgb.opacity = o);\n    return rgb;\n};\n/*\\\n * Snap.color\n [ method ]\n **\n * Parses the color string and returns an object featuring the color's component values\n - clr (string) color string in one of the supported formats (see @Snap.getRGB)\n = (object) Combined RGB/HSB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••,\n o     error (boolean) `true` if string can't be parsed,\n o     h (number) hue,\n o     s (number) saturation,\n o     v (number) value (brightness),\n o     l (number) lightness\n o }\n\\*/\nSnap.color = function (clr) {\n    var rgb;\n    if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"b\" in clr) {\n        rgb = Snap.hsb2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else if (is(clr, \"object\") && \"h\" in clr && \"s\" in clr && \"l\" in clr) {\n        rgb = Snap.hsl2rgb(clr);\n        clr.r = rgb.r;\n        clr.g = rgb.g;\n        clr.b = rgb.b;\n        clr.opacity = 1;\n        clr.hex = rgb.hex;\n    } else {\n        if (is(clr, \"string\")) {\n            clr = Snap.getRGB(clr);\n        }\n        if (is(clr, \"object\") && \"r\" in clr && \"g\" in clr && \"b\" in clr && !(\"error\" in clr)) {\n            rgb = Snap.rgb2hsl(clr);\n            clr.h = rgb.h;\n            clr.s = rgb.s;\n            clr.l = rgb.l;\n            rgb = Snap.rgb2hsb(clr);\n            clr.v = rgb.b;\n        } else {\n            clr = {hex: \"none\"};\n            clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;\n            clr.error = 1;\n        }\n    }\n    clr.toString = rgbtoString;\n    return clr;\n};\n/*\\\n * Snap.hsb2rgb\n [ method ]\n **\n * Converts HSB values to an RGB object\n - h (number) hue\n - s (number) saturation\n - v (number) value or brightness\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsb2rgb = function (h, s, v, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"b\" in h) {\n        v = h.b;\n        s = h.s;\n        o = h.o;\n        h = h.h;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = h % 360 / 60;\n    C = v * s;\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = v - C;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.hsl2rgb\n [ method ]\n **\n * Converts HSL values to an RGB object\n - h (number) hue\n - s (number) saturation\n - l (number) luminosity\n = (object) RGB object in the following format:\n o {\n o     r (number) red,\n o     g (number) green,\n o     b (number) blue,\n o     hex (string) color in HTML/CSS format: #••••••\n o }\n\\*/\nSnap.hsl2rgb = function (h, s, l, o) {\n    if (is(h, \"object\") && \"h\" in h && \"s\" in h && \"l\" in h) {\n        l = h.l;\n        s = h.s;\n        h = h.h;\n    }\n    if (h > 1 || s > 1 || l > 1) {\n        h /= 360;\n        s /= 100;\n        l /= 100;\n    }\n    h *= 360;\n    var R, G, B, X, C;\n    h = h % 360 / 60;\n    C = 2 * s * (l < .5 ? l : 1 - l);\n    X = C * (1 - abs(h % 2 - 1));\n    R = G = B = l - C / 2;\n\n    h = ~~h;\n    R += [C, X, 0, 0, X, C][h];\n    G += [X, C, C, X, 0, 0][h];\n    B += [0, 0, X, C, C, X][h];\n    return packageRGB(R, G, B, o);\n};\n/*\\\n * Snap.rgb2hsb\n [ method ]\n **\n * Converts RGB values to an HSB object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSB object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     b (number) brightness\n o }\n\\*/\nSnap.rgb2hsb = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, V, C;\n    V = mmax(r, g, b);\n    C = V - mmin(r, g, b);\n    H = C == 0 ? null :\n        V == r ? (g - b) / C :\n        V == g ? (b - r) / C + 2 :\n                 (r - g) / C + 4;\n    H = (H + 360) % 6 * 60 / 360;\n    S = C == 0 ? 0 : C / V;\n    return {h: H, s: S, b: V, toString: hsbtoString};\n};\n/*\\\n * Snap.rgb2hsl\n [ method ]\n **\n * Converts RGB values to an HSL object\n - r (number) red\n - g (number) green\n - b (number) blue\n = (object) HSL object in the following format:\n o {\n o     h (number) hue,\n o     s (number) saturation,\n o     l (number) luminosity\n o }\n\\*/\nSnap.rgb2hsl = function (r, g, b) {\n    b = prepareRGB(r, g, b);\n    r = b[0];\n    g = b[1];\n    b = b[2];\n\n    var H, S, L, M, m, C;\n    M = mmax(r, g, b);\n    m = mmin(r, g, b);\n    C = M - m;\n    H = C == 0 ? null :\n        M == r ? (g - b) / C :\n        M == g ? (b - r) / C + 2 :\n                 (r - g) / C + 4;\n    H = (H + 360) % 6 * 60 / 360;\n    L = (M + m) / 2;\n    S = C == 0 ? 0 :\n         L < .5 ? C / (2 * L) :\n                  C / (2 - 2 * L);\n    return {h: H, s: S, l: L, toString: hsltoString};\n};\n\n// Transformations\n/*\\\n * Snap.parsePathString\n [ method ]\n **\n * Utility method\n **\n * Parses given path string into an array of arrays of path segments\n - pathString (string|array) path string or array of segments (in the last case it is returned straight away)\n = (array) array of segments\n\\*/\nSnap.parsePathString = function (pathString) {\n    if (!pathString) {\n        return null;\n    }\n    var pth = Snap.path(pathString);\n    if (pth.arr) {\n        return Snap.path.clone(pth.arr);\n    }\n\n    var paramCounts = {a: 7, c: 6, o: 2, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, u: 3, z: 0},\n        data = [];\n    if (is(pathString, \"array\") && is(pathString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(pathString);\n    }\n    if (!data.length) {\n        Str(pathString).replace(pathCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            if (name == \"m\" && params.length > 2) {\n                data.push([b].concat(params.splice(0, 2)));\n                name = \"l\";\n                b = b == \"m\" ? \"l\" : \"L\";\n            }\n            if (name == \"o\" && params.length == 1) {\n                data.push([b, params[0]]);\n            }\n            if (name == \"r\") {\n                data.push([b].concat(params));\n            } else while (params.length >= paramCounts[name]) {\n                data.push([b].concat(params.splice(0, paramCounts[name])));\n                if (!paramCounts[name]) {\n                    break;\n                }\n            }\n        });\n    }\n    data.toString = Snap.path.toString;\n    pth.arr = Snap.path.clone(data);\n    return data;\n};\n/*\\\n * Snap.parseTransformString\n [ method ]\n **\n * Utility method\n **\n * Parses given transform string into an array of transformations\n - TString (string|array) transform string or array of transformations (in the last case it is returned straight away)\n = (array) array of transformations\n\\*/\nvar parseTransformString = Snap.parseTransformString = function (TString) {\n    if (!TString) {\n        return null;\n    }\n    var paramCounts = {r: 3, s: 4, t: 2, m: 6},\n        data = [];\n    if (is(TString, \"array\") && is(TString[0], \"array\")) { // rough assumption\n        data = Snap.path.clone(TString);\n    }\n    if (!data.length) {\n        Str(TString).replace(tCommand, function (a, b, c) {\n            var params = [],\n                name = b.toLowerCase();\n            c.replace(pathValues, function (a, b) {\n                b && params.push(+b);\n            });\n            data.push([b].concat(params));\n        });\n    }\n    data.toString = Snap.path.toString;\n    return data;\n};\nfunction svgTransform2string(tstr) {\n    var res = [];\n    tstr = tstr.replace(/(?:^|\\s)(\\w+)\\(([^)]+)\\)/g, function (all, name, params) {\n        params = params.split(/\\s*,\\s*|\\s+/);\n        if (name == \"rotate\" && params.length == 1) {\n            params.push(0, 0);\n        }\n        if (name == \"scale\") {\n            if (params.length > 2) {\n                params = params.slice(0, 2);\n            } else if (params.length == 2) {\n                params.push(0, 0);\n            }\n            if (params.length == 1) {\n                params.push(params[0], 0, 0);\n            }\n        }\n        if (name == \"skewX\") {\n            res.push([\"m\", 1, 0, math.tan(rad(params[0])), 1, 0, 0]);\n        } else if (name == \"skewY\") {\n            res.push([\"m\", 1, math.tan(rad(params[0])), 0, 1, 0, 0]);\n        } else {\n            res.push([name.charAt(0)].concat(params));\n        }\n        return all;\n    });\n    return res;\n}\nSnap._.svgTransform2string = svgTransform2string;\nSnap._.rgTransform = /^[a-z][\\s]*-?\\.?\\d/i;\nfunction transform2matrix(tstr, bbox) {\n    var tdata = parseTransformString(tstr),\n        m = new Snap.Matrix;\n    if (tdata) {\n        for (var i = 0, ii = tdata.length; i < ii; i++) {\n            var t = tdata[i],\n                tlen = t.length,\n                command = Str(t[0]).toLowerCase(),\n                absolute = t[0] != command,\n                inver = absolute ? m.invert() : 0,\n                x1,\n                y1,\n                x2,\n                y2,\n                bb;\n            if (command == \"t\" && tlen == 2){\n                m.translate(t[1], 0);\n            } else if (command == \"t\" && tlen == 3) {\n                if (absolute) {\n                    x1 = inver.x(0, 0);\n                    y1 = inver.y(0, 0);\n                    x2 = inver.x(t[1], t[2]);\n                    y2 = inver.y(t[1], t[2]);\n                    m.translate(x2 - x1, y2 - y1);\n                } else {\n                    m.translate(t[1], t[2]);\n                }\n            } else if (command == \"r\") {\n                if (tlen == 2) {\n                    bb = bb || bbox;\n                    m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.rotate(t[1], x2, y2);\n                    } else {\n                        m.rotate(t[1], t[2], t[3]);\n                    }\n                }\n            } else if (command == \"s\") {\n                if (tlen == 2 || tlen == 3) {\n                    bb = bb || bbox;\n                    m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);\n                } else if (tlen == 4) {\n                    if (absolute) {\n                        x2 = inver.x(t[2], t[3]);\n                        y2 = inver.y(t[2], t[3]);\n                        m.scale(t[1], t[1], x2, y2);\n                    } else {\n                        m.scale(t[1], t[1], t[2], t[3]);\n                    }\n                } else if (tlen == 5) {\n                    if (absolute) {\n                        x2 = inver.x(t[3], t[4]);\n                        y2 = inver.y(t[3], t[4]);\n                        m.scale(t[1], t[2], x2, y2);\n                    } else {\n                        m.scale(t[1], t[2], t[3], t[4]);\n                    }\n                }\n            } else if (command == \"m\" && tlen == 7) {\n                m.add(t[1], t[2], t[3], t[4], t[5], t[6]);\n            }\n        }\n    }\n    return m;\n}\nSnap._.transform2matrix = transform2matrix;\nSnap._unit2px = unit2px;\nvar contains = glob.doc.contains || glob.doc.compareDocumentPosition ?\n    function (a, b) {\n        var adown = a.nodeType == 9 ? a.documentElement : a,\n            bup = b && b.parentNode;\n            return a == bup || !!(bup && bup.nodeType == 1 && (\n                adown.contains ?\n                    adown.contains(bup) :\n                    a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\n            ));\n    } :\n    function (a, b) {\n        if (b) {\n            while (b) {\n                b = b.parentNode;\n                if (b == a) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    };\nfunction getSomeDefs(el) {\n    var p = el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) ||\n            el.node.parentNode && wrap(el.node.parentNode) ||\n            Snap.select(\"svg\") ||\n            Snap(0, 0),\n        pdefs = p.select(\"defs\"),\n        defs  = pdefs == null ? false : pdefs.node;\n    if (!defs) {\n        defs = make(\"defs\", p.node).node;\n    }\n    return defs;\n}\nfunction getSomeSVG(el) {\n    return el.node.ownerSVGElement && wrap(el.node.ownerSVGElement) || Snap.select(\"svg\");\n}\nSnap._.getSomeDefs = getSomeDefs;\nSnap._.getSomeSVG = getSomeSVG;\nfunction unit2px(el, name, value) {\n    var svg = getSomeSVG(el).node,\n        out = {},\n        mgr = svg.querySelector(\".svg---mgr\");\n    if (!mgr) {\n        mgr = $(\"rect\");\n        $(mgr, {x: -9e9, y: -9e9, width: 10, height: 10, \"class\": \"svg---mgr\", fill: \"none\"});\n        svg.appendChild(mgr);\n    }\n    function getW(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {width: val});\n        try {\n            return mgr.getBBox().width;\n        } catch (e) {\n            return 0;\n        }\n    }\n    function getH(val) {\n        if (val == null) {\n            return E;\n        }\n        if (val == +val) {\n            return val;\n        }\n        $(mgr, {height: val});\n        try {\n            return mgr.getBBox().height;\n        } catch (e) {\n            return 0;\n        }\n    }\n    function set(nam, f) {\n        if (name == null) {\n            out[nam] = f(el.attr(nam) || 0);\n        } else if (nam == name) {\n            out = f(value == null ? el.attr(nam) || 0 : value);\n        }\n    }\n    switch (el.type) {\n        case \"rect\":\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        case \"image\":\n            set(\"width\", getW);\n            set(\"height\", getH);\n        case \"text\":\n            set(\"x\", getW);\n            set(\"y\", getH);\n        break;\n        case \"circle\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"r\", getW);\n        break;\n        case \"ellipse\":\n            set(\"cx\", getW);\n            set(\"cy\", getH);\n            set(\"rx\", getW);\n            set(\"ry\", getH);\n        break;\n        case \"line\":\n            set(\"x1\", getW);\n            set(\"x2\", getW);\n            set(\"y1\", getH);\n            set(\"y2\", getH);\n        break;\n        case \"marker\":\n            set(\"refX\", getW);\n            set(\"markerWidth\", getW);\n            set(\"refY\", getH);\n            set(\"markerHeight\", getH);\n        break;\n        case \"radialGradient\":\n            set(\"fx\", getW);\n            set(\"fy\", getH);\n        break;\n        case \"tspan\":\n            set(\"dx\", getW);\n            set(\"dy\", getH);\n        break;\n        default:\n            set(name, getW);\n    }\n    svg.removeChild(mgr);\n    return out;\n}\n/*\\\n * Snap.select\n [ method ]\n **\n * Wraps a DOM element specified by CSS selector as @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.select = function (query) {\n    query = Str(query).replace(/([^\\\\]):/g, \"$1\\\\:\");\n    return wrap(glob.doc.querySelector(query));\n};\n/*\\\n * Snap.selectAll\n [ method ]\n **\n * Wraps DOM elements specified by CSS selector as set or array of @Element\n - query (string) CSS selector of the element\n = (Element) the current element\n\\*/\nSnap.selectAll = function (query) {\n    var nodelist = glob.doc.querySelectorAll(query),\n        set = (Snap.set || Array)();\n    for (var i = 0; i < nodelist.length; i++) {\n        set.push(wrap(nodelist[i]));\n    }\n    return set;\n};\n\nfunction add2group(list) {\n    if (!is(list, \"array\")) {\n        list = Array.prototype.slice.call(arguments, 0);\n    }\n    var i = 0,\n        j = 0,\n        node = this.node;\n    while (this[i]) delete this[i++];\n    for (i = 0; i < list.length; i++) {\n        if (list[i].type == \"set\") {\n            list[i].forEach(function (el) {\n                node.appendChild(el.node);\n            });\n        } else {\n            node.appendChild(list[i].node);\n        }\n    }\n    var children = node.childNodes;\n    for (i = 0; i < children.length; i++) {\n        this[j++] = wrap(children[i]);\n    }\n    return this;\n}\n// Hub garbage collector every 10s\nsetInterval(function () {\n    for (var key in hub) if (hub[has](key)) {\n        var el = hub[key],\n            node = el.node;\n        if (el.type != \"svg\" && !node.ownerSVGElement || el.type == \"svg\" && (!node.parentNode || \"ownerSVGElement\" in node.parentNode && !node.ownerSVGElement)) {\n            delete hub[key];\n        }\n    }\n}, 1e4);\nfunction Element(el) {\n    if (el.snap in hub) {\n        return hub[el.snap];\n    }\n    var svg;\n    try {\n        svg = el.ownerSVGElement;\n    } catch(e) {}\n    /*\\\n     * Element.node\n     [ property (object) ]\n     **\n     * Gives you a reference to the DOM object, so you can assign event handlers or just mess around.\n     > Usage\n     | // draw a circle at coordinate 10,10 with radius of 10\n     | var c = paper.circle(10, 10, 10);\n     | c.node.onclick = function () {\n     |     c.attr(\"fill\", \"red\");\n     | };\n    \\*/\n    this.node = el;\n    if (svg) {\n        this.paper = new Paper(svg);\n    }\n    /*\\\n     * Element.type\n     [ property (string) ]\n     **\n     * SVG tag name of the given element.\n    \\*/\n    this.type = el.tagName || el.nodeName;\n    var id = this.id = ID(this);\n    this.anims = {};\n    this._ = {\n        transform: []\n    };\n    el.snap = id;\n    hub[id] = this;\n    if (this.type == \"g\") {\n        this.add = add2group;\n    }\n    if (this.type in {g: 1, mask: 1, pattern: 1, symbol: 1}) {\n        for (var method in Paper.prototype) if (Paper.prototype[has](method)) {\n            this[method] = Paper.prototype[method];\n        }\n    }\n}\n   /*\\\n     * Element.attr\n     [ method ]\n     **\n     * Gets or sets given attributes of the element.\n     **\n     - params (object) contains key-value pairs of attributes you want to set\n     * or\n     - param (string) name of the attribute\n     = (Element) the current element\n     * or\n     = (string) value of attribute\n     > Usage\n     | el.attr({\n     |     fill: \"#fc0\",\n     |     stroke: \"#000\",\n     |     strokeWidth: 2, // CamelCase...\n     |     \"fill-opacity\": 0.5, // or dash-separated names\n     |     width: \"*=2\" // prefixed values\n     | });\n     | console.log(el.attr(\"fill\")); // #fc0\n     * Prefixed values in format `\"+=10\"` supported. All four operations\n     * (`+`, `-`, `*` and `/`) could be used. Optionally you can use units for `+`\n     * and `-`: `\"+=2em\"`.\n    \\*/\n    Element.prototype.attr = function (params, value) {\n        var el = this,\n            node = el.node;\n        if (!params) {\n            if (node.nodeType != 1) {\n                return {\n                    text: node.nodeValue\n                };\n            }\n            var attr = node.attributes,\n                out = {};\n            for (var i = 0, ii = attr.length; i < ii; i++) {\n                out[attr[i].nodeName] = attr[i].nodeValue;\n            }\n            return out;\n        }\n        if (is(params, \"string\")) {\n            if (arguments.length > 1) {\n                var json = {};\n                json[params] = value;\n                params = json;\n            } else {\n                return eve(\"snap.util.getattr.\" + params, el).firstDefined();\n            }\n        }\n        for (var att in params) {\n            if (params[has](att)) {\n                eve(\"snap.util.attr.\" + att, el, params[att]);\n            }\n        }\n        return el;\n    };\n/*\\\n * Snap.parse\n [ method ]\n **\n * Parses SVG fragment and converts it into a @Fragment\n **\n - svg (string) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.parse = function (svg) {\n    var f = glob.doc.createDocumentFragment(),\n        full = true,\n        div = glob.doc.createElement(\"div\");\n    svg = Str(svg);\n    if (!svg.match(/^\\s*<\\s*svg(?:\\s|>)/)) {\n        svg = \"<svg>\" + svg + \"</svg>\";\n        full = false;\n    }\n    div.innerHTML = svg;\n    svg = div.getElementsByTagName(\"svg\")[0];\n    if (svg) {\n        if (full) {\n            f = svg;\n        } else {\n            while (svg.firstChild) {\n                f.appendChild(svg.firstChild);\n            }\n        }\n    }\n    return new Fragment(f);\n};\nfunction Fragment(frag) {\n    this.node = frag;\n}\n/*\\\n * Snap.fragment\n [ method ]\n **\n * Creates a DOM fragment from a given list of elements or strings\n **\n - varargs (…) SVG string\n = (Fragment) the @Fragment\n\\*/\nSnap.fragment = function () {\n    var args = Array.prototype.slice.call(arguments, 0),\n        f = glob.doc.createDocumentFragment();\n    for (var i = 0, ii = args.length; i < ii; i++) {\n        var item = args[i];\n        if (item.node && item.node.nodeType) {\n            f.appendChild(item.node);\n        }\n        if (item.nodeType) {\n            f.appendChild(item);\n        }\n        if (typeof item == \"string\") {\n            f.appendChild(Snap.parse(item).node);\n        }\n    }\n    return new Fragment(f);\n};\n\nfunction make(name, parent) {\n    var res = $(name);\n    parent.appendChild(res);\n    var el = wrap(res);\n    return el;\n}\nfunction Paper(w, h) {\n    var res,\n        desc,\n        defs,\n        proto = Paper.prototype;\n    if (w && w.tagName && w.tagName.toLowerCase() == \"svg\") {\n        if (w.snap in hub) {\n            return hub[w.snap];\n        }\n        var doc = w.ownerDocument;\n        res = new Element(w);\n        desc = w.getElementsByTagName(\"desc\")[0];\n        defs = w.getElementsByTagName(\"defs\")[0];\n        if (!desc) {\n            desc = $(\"desc\");\n            desc.appendChild(doc.createTextNode(\"Created with Snap\"));\n            res.node.appendChild(desc);\n        }\n        if (!defs) {\n            defs = $(\"defs\");\n            res.node.appendChild(defs);\n        }\n        res.defs = defs;\n        for (var key in proto) if (proto[has](key)) {\n            res[key] = proto[key];\n        }\n        res.paper = res.root = res;\n    } else {\n        res = make(\"svg\", glob.doc.body);\n        $(res.node, {\n            height: h,\n            version: 1.1,\n            width: w,\n            xmlns: xmlns\n        });\n    }\n    return res;\n}\nfunction wrap(dom) {\n    if (!dom) {\n        return dom;\n    }\n    if (dom instanceof Element || dom instanceof Fragment) {\n        return dom;\n    }\n    if (dom.tagName && dom.tagName.toLowerCase() == \"svg\") {\n        return new Paper(dom);\n    }\n    if (dom.tagName && dom.tagName.toLowerCase() == \"object\" && dom.type == \"image/svg+xml\") {\n        return new Paper(dom.contentDocument.getElementsByTagName(\"svg\")[0]);\n    }\n    return new Element(dom);\n}\n\nSnap._.make = make;\nSnap._.wrap = wrap;\n/*\\\n * Paper.el\n [ method ]\n **\n * Creates an element on paper with a given name and no attributes\n **\n - name (string) tag name\n - attr (object) attributes\n = (Element) the current element\n > Usage\n | var c = paper.circle(10, 10, 10); // is the same as...\n | var c = paper.el(\"circle\").attr({\n |     cx: 10,\n |     cy: 10,\n |     r: 10\n | });\n | // and the same as\n | var c = paper.el(\"circle\", {\n |     cx: 10,\n |     cy: 10,\n |     r: 10\n | });\n\\*/\nPaper.prototype.el = function (name, attr) {\n    var el = make(name, this.node);\n    attr && el.attr(attr);\n    return el;\n};\n/*\\\n * Element.children\n [ method ]\n **\n * Returns array of all the children of the element.\n = (array) array of Elements\n\\*/\nElement.prototype.children = function () {\n    var out = [],\n        ch = this.node.childNodes;\n    for (var i = 0, ii = ch.length; i < ii; i++) {\n        out[i] = Snap(ch[i]);\n    }\n    return out;\n};\nfunction jsonFiller(root, o) {\n    for (var i = 0, ii = root.length; i < ii; i++) {\n        var item = {\n                type: root[i].type,\n                attr: root[i].attr()\n            },\n            children = root[i].children();\n        o.push(item);\n        if (children.length) {\n            jsonFiller(children, item.childNodes = []);\n        }\n    }\n}\n/*\\\n * Element.toJSON\n [ method ]\n **\n * Returns object representation of the given element and all its children.\n = (object) in format\n o {\n o     type (string) this.type,\n o     attr (object) attributes map,\n o     childNodes (array) optional array of children in the same format\n o }\n\\*/\nElement.prototype.toJSON = function () {\n    var out = [];\n    jsonFiller([this], out);\n    return out[0];\n};\n// default\neve.on(\"snap.util.getattr\", function () {\n    var att = eve.nt();\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    var css = att.replace(/[A-Z]/g, function (letter) {\n        return \"-\" + letter.toLowerCase();\n    });\n    if (cssAttr[has](css)) {\n        return this.node.ownerDocument.defaultView.getComputedStyle(this.node, null).getPropertyValue(css);\n    } else {\n        return $(this.node, att);\n    }\n});\nvar cssAttr = {\n    \"alignment-baseline\": 0,\n    \"baseline-shift\": 0,\n    \"clip\": 0,\n    \"clip-path\": 0,\n    \"clip-rule\": 0,\n    \"color\": 0,\n    \"color-interpolation\": 0,\n    \"color-interpolation-filters\": 0,\n    \"color-profile\": 0,\n    \"color-rendering\": 0,\n    \"cursor\": 0,\n    \"direction\": 0,\n    \"display\": 0,\n    \"dominant-baseline\": 0,\n    \"enable-background\": 0,\n    \"fill\": 0,\n    \"fill-opacity\": 0,\n    \"fill-rule\": 0,\n    \"filter\": 0,\n    \"flood-color\": 0,\n    \"flood-opacity\": 0,\n    \"font\": 0,\n    \"font-family\": 0,\n    \"font-size\": 0,\n    \"font-size-adjust\": 0,\n    \"font-stretch\": 0,\n    \"font-style\": 0,\n    \"font-variant\": 0,\n    \"font-weight\": 0,\n    \"glyph-orientation-horizontal\": 0,\n    \"glyph-orientation-vertical\": 0,\n    \"image-rendering\": 0,\n    \"kerning\": 0,\n    \"letter-spacing\": 0,\n    \"lighting-color\": 0,\n    \"marker\": 0,\n    \"marker-end\": 0,\n    \"marker-mid\": 0,\n    \"marker-start\": 0,\n    \"mask\": 0,\n    \"opacity\": 0,\n    \"overflow\": 0,\n    \"pointer-events\": 0,\n    \"shape-rendering\": 0,\n    \"stop-color\": 0,\n    \"stop-opacity\": 0,\n    \"stroke\": 0,\n    \"stroke-dasharray\": 0,\n    \"stroke-dashoffset\": 0,\n    \"stroke-linecap\": 0,\n    \"stroke-linejoin\": 0,\n    \"stroke-miterlimit\": 0,\n    \"stroke-opacity\": 0,\n    \"stroke-width\": 0,\n    \"text-anchor\": 0,\n    \"text-decoration\": 0,\n    \"text-rendering\": 0,\n    \"unicode-bidi\": 0,\n    \"visibility\": 0,\n    \"word-spacing\": 0,\n    \"writing-mode\": 0\n};\n\neve.on(\"snap.util.attr\", function (value) {\n    var att = eve.nt(),\n        attr = {};\n    att = att.substring(att.lastIndexOf(\".\") + 1);\n    attr[att] = value;\n    var style = att.replace(/-(\\w)/gi, function (all, letter) {\n            return letter.toUpperCase();\n        }),\n        css = att.replace(/[A-Z]/g, function (letter) {\n            return \"-\" + letter.toLowerCase();\n        });\n    if (cssAttr[has](css)) {\n        this.node.style[style] = value == null ? E : value;\n    } else {\n        $(this.node, attr);\n    }\n});\n(function (proto) {}(Paper.prototype));\n\n// simple ajax\n/*\\\n * Snap.ajax\n [ method ]\n **\n * Simple implementation of Ajax\n **\n - url (string) URL\n - postData (object|string) data for post request\n - callback (function) callback\n - scope (object) #optional scope of callback\n * or\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n = (XMLHttpRequest) the XMLHttpRequest object, just in case\n\\*/\nSnap.ajax = function (url, postData, callback, scope){\n    var req = new XMLHttpRequest,\n        id = ID();\n    if (req) {\n        if (is(postData, \"function\")) {\n            scope = callback;\n            callback = postData;\n            postData = null;\n        } else if (is(postData, \"object\")) {\n            var pd = [];\n            for (var key in postData) if (postData.hasOwnProperty(key)) {\n                pd.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(postData[key]));\n            }\n            postData = pd.join(\"&\");\n        }\n        req.open(postData ? \"POST\" : \"GET\", url, true);\n        if (postData) {\n            req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n            req.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n        }\n        if (callback) {\n            eve.once(\"snap.ajax.\" + id + \".0\", callback);\n            eve.once(\"snap.ajax.\" + id + \".200\", callback);\n            eve.once(\"snap.ajax.\" + id + \".304\", callback);\n        }\n        req.onreadystatechange = function() {\n            if (req.readyState != 4) return;\n            eve(\"snap.ajax.\" + id + \".\" + req.status, scope, req);\n        };\n        if (req.readyState == 4) {\n            return req;\n        }\n        req.send(postData);\n        return req;\n    }\n};\n/*\\\n * Snap.load\n [ method ]\n **\n * Loads external SVG file as a @Fragment (see @Snap.ajax for more advanced AJAX)\n **\n - url (string) URL\n - callback (function) callback\n - scope (object) #optional scope of callback\n\\*/\nSnap.load = function (url, callback, scope) {\n    Snap.ajax(url, function (req) {\n        var f = Snap.parse(req.responseText);\n        scope ? callback.call(scope, f) : callback(f);\n    });\n};\nvar getOffset = function (elem) {\n    var box = elem.getBoundingClientRect(),\n        doc = elem.ownerDocument,\n        body = doc.body,\n        docElem = doc.documentElement,\n        clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,\n        top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,\n        left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;\n    return {\n        y: top,\n        x: left\n    };\n};\n/*\\\n * Snap.getElementByPoint\n [ method ]\n **\n * Returns you topmost element under given point.\n **\n = (object) Snap element object\n - x (number) x coordinate from the top left corner of the window\n - y (number) y coordinate from the top left corner of the window\n > Usage\n | Snap.getElementByPoint(mouseX, mouseY).attr({stroke: \"#f00\"});\n\\*/\nSnap.getElementByPoint = function (x, y) {\n    var paper = this,\n        svg = paper.canvas,\n        target = glob.doc.elementFromPoint(x, y);\n    if (glob.win.opera && target.tagName == \"svg\") {\n        var so = getOffset(target),\n            sr = target.createSVGRect();\n        sr.x = x - so.x;\n        sr.y = y - so.y;\n        sr.width = sr.height = 1;\n        var hits = target.getIntersectionList(sr, null);\n        if (hits.length) {\n            target = hits[hits.length - 1];\n        }\n    }\n    if (!target) {\n        return null;\n    }\n    return wrap(target);\n};\n/*\\\n * Snap.plugin\n [ method ]\n **\n * Let you write plugins. You pass in a function with five arguments, like this:\n | Snap.plugin(function (Snap, Element, Paper, global, Fragment) {\n |     Snap.newmethod = function () {};\n |     Element.prototype.newmethod = function () {};\n |     Paper.prototype.newmethod = function () {};\n | });\n * Inside the function you have access to all main objects (and their\n * prototypes). This allow you to extend anything you want.\n **\n - f (function) your plugin body\n\\*/\nSnap.plugin = function (f) {\n    f(Snap, Element, Paper, glob, Fragment);\n};\nglob.win.Snap = Snap;\nreturn Snap;\n}(window || this));\n"
  },
  {
    "path": "template.dot",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n        <base href=\"http://snapsvg.io/docs/\">\n        <title>Snap.svg API Reference</title>\n        <link rel=\"shortcut icon\" href=\"/assets/favicon.ico?v=1\">\n        <meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/fonts/stylesheet.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/css/main.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/css/dr.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/docs/css/prism.css?v=201311041519\">\n        <link rel=\"stylesheet\" href=\"/assets/style/docs-header.css?v=201311041519\">\n        <script>\n            var _gaq = _gaq || [];\n            _gaq.push(['_setAccount', 'UA-44948757-1']);\n            _gaq.push(['_trackPageview']);\n\n            (function() {\n                var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n                ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n                var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n            })();\n\n            function trackOutboundLink(link, category, action) {\n                try {\n                    _gaq.push(['_trackEvent', category , action]);\n                } catch(err){}\n\n                setTimeout(function() {\n                    document.location.href = link.href;\n                }, 100);\n            }\n        </script>\n    </head>\n    <body class=\"light\">\n\n        <header id=\"header\">\n            <div class=\"wrap\">\n                <a href=\"/\" class=\"logo\">\n                    <img src=\"/assets/images/logo.svg\" alt=\"\"/>\n                    <span class=\"header\">Snap.svg</span>\n                </a>\n                <nav>\n                    <a href=\"/\">Home</a>\n                    <a href=\"/about/\">Why Snap</a>\n                    <a href=\"/start/\" class=\"mobile-hide\">Getting Started</a>\n                    <a href=\"/docs/\" class=\"mobile-hide selected\">Docs</a>\n                    <a href=\"/support/\">Support</a>\n                    <a href=\"/demos/\" class=\"mobile-hide\">Demos</a>\n                    <a class=\"bt\" href=\"/assets/downloads/Snap.svg-0.5.0.zip\" onclick=\"trackOutboundLink(this, 'Download', '0.5.0');return false;\">Download</a>\n                </nav>\n            </div>\n        </header>\n\n<!--[if lt IE 9]>\n<script src=\"//html5shiv.googlecode.com/svn/trunk/html5.js\"></script><![endif]-->\n\n        <div id=\"wrapper\">\n            <div class=\"max-width\">\n                  <div id=\"sideNav\">\n                      <div class=\"combo\">\n                          <input type=\"search\" id=\"dr-filter\" value=\"\" placeholder=\"search\">\n                      </div>\n                      <div id=\"pageNav\">\n                          <ol id=\"dr-toc\">\n                              {{ for (var i = 0; i < it.toc.length; i++) { }}\n                              <li class=\"dr-lvl{{=it.toc[i].indent}}\">\n                                  <a href=\"#{{=it.toc[i].name}}\" class=\"{{=it.toc[i].clas}}\"><span>{{=it.toc[i].name}}{{=it.toc[i].brackets}}</span></a>\n                              </li>\n                              {{ } }}\n                          </ol>\n                      </div>\n                  </div>\n              </div>\n              <div id=\"site\">\n                  <div id=\"content\" class=\"max-width\">\n                      {{~it.out :item:index}}\n                      <article id=\"{{=item[0].title}}\">\n                          <header>\n                              <h2 class=\"{{=item[0].clas}}\">{{=item[0].name}}<a href=\"#{{=item[0].title}}\" title=\"Link to this section\" class=\"dr-hash\">&#x2693;</a><a class=\"dr-sourceline\" title=\"Go to line {{=item[0].line}} in the source\" href=\"https://github.com/adobe-webplatform/Snap.svg/blob/master/src/svg.js#L{{=item[0].line}}\">&#x27ad;</a></h2>\n                          </header>\n                          <section>\n                              <div class=\"extra\" id=\"{{=item[0].title}}-extra\"></div>\n                              <div class=\"{{=item[0].clas}}\">\n                                  {{~item :line:i}}\n                                  {{ if (i > 0) { }}\n                                  {{ if (line.text) { }}<p>{{=line.text.join(\"</p><p>\")}}</p>{{ } }}\n                                  {{ if (line.attr) { }}<div class=\"params\">\n                                      <h3 class=\"params\">Parameters</h3>\n                                      <ol class=\"params-list\">\n                                          {{~line.attr :attr:j}}<li><span class=\"dr-param\">{{=attr.name}}</span>\n                                              <span class=\"dr-type\">{{~attr.type :type:k}}<em class=\"dr-type-{{=type}}\">{{=type}}</em> {{~}}</span>\n                                              <span class=\"dr-description\">{{=attr.desc}}</span></li>\n                                          {{~}}\n                                      </ol>\n                                  </div>{{ } }}\n                                  {{ if (line.html) { }}{{=line.html}}\n                                  {{ } }}\n                                  {{ if (line.head) { }}<h3>{{=line.head}}</h3>\n                                  {{ } }}\n                                  {{ if (line.code) { }}<section class=\"code\"><pre class=\"javascript code\"><code data-language=\"javascript\" class=\"language-javascript\">{{=line.code.join(\"\\n\")}}</code></pre></section>\n                                  {{ } }}\n                                  {{ if (line.rtrn) { }}<p class=\"dr-returns\">\n                                      <strong class=\"dr-title\">Returns:</strong>\n                                      {{~line.rtrn.type :type:k}}\n                                      <em class=\"dr-type-{{=type}}\">{{=type}}</em>\n                                      {{~}}\n                                      <span class=\"dr-description\">{{=line.rtrn.desc}}</span>\n                                  </p>\n                                  {{ } }}\n                                  {{ if (line.json) { }}<ol class=\"dr-json\">\n                                      {{~line.json :a:j}}\n                                      {{ if (a.key) { }}\n                                      <li>\n                                          <span class=\"dr-json-key\">{{=a.key}}</span>\n                                          <span class=\"dr-type\">{{~a.type :type:k}}<em class=\"dr-type-{{=type}}\">{{=type}}</em> {{~}}</span>\n                                          <span class=\"dr-json-description\">{{=a.desc}}</span>\n                                      </li>\n                                      {{ } else if (a.start) { }}\n                                      <li>{{=a.start}}<ol class=\"dr-json\">\n                                      {{ } else if (a.end) { }}\n                                      </ol></li><li>{{=a.end}}</li>\n                                      {{ } else { }}\n                                      <li>{{=a}}</li>\n                                      {{ } }}\n                                      {{~}}\n                                  </ol>{{ } }}\n                                  {{ } }}\n                                  {{~}}\n                              </div>\n                          </section>\n                      </article>\n                      {{~}}\n                  </div>\n        <footer></footer>\n      </div>\n    </div>\n    <!-- <script src=\"//use.edgefonts.net/source-sans-pro:n3,n4,n6;source-code-pro:n3.js\"></script> -->\n    <script src=\"/assets/docs/js/prism.js\"></script>\n<script>!function(e){if(e){for(var t=function(e,t){var n=t.toUpperCase().split(\"\"),r=n.shift(),a=RegExp(\"^[\"+r.toLowerCase()+r+\"][a-z]*\"+n.join(\"[a-z]*\")+\"[a-z]*$\")\nreturn!!(e+\"\").match(a)},n=function(e,n){e+=\"\",n+=\"\"\nvar r,a=0\nif(e==n)return 1\nif(!e||!n)return 0\nif(t(e,n))return.9\na=0,r=e.toLowerCase()\nfor(var i,o=0,l=n.length;l>o;o++)i=r.indexOf(n.charAt(o)),~i&&(r=r.substring(i+1),a+=1/(i+1))\nreturn a=Math.max(a/l-Math.abs(e.length-l)/e.length/2,0)},r=e.getElementsByTagName(\"span\"),a=[],i=/[^\\.\\(]*(?=(\\(\\))?$)/,o=0,l=r.length;l>o;o++)a[o]={li:r[o].parentNode.parentNode,text:r[o].innerHTML.match(i)[0]}\nvar h=document.getElementById(\"dr-filter\"),f=function(e,t){return t.weight-e.weight}\nh.onclick=h.onchange=h.onkeydown=h.onkeyup=function(){var t=h.value,r=[]\nif(t.length>1){for(var i=0,o=a.length;o>i;i++)r[i]={li:a[i].li,weight:n(a[i].text,t)}\nr.sort(f)}else r=a\nfor(i=0,o=r.length;o>i;i++)e.appendChild(r[i].li)}}}(document.getElementById(\"dr-toc\"))</script>\n</body></html>\n"
  },
  {
    "path": "test/attradd.js",
    "content": "describe(\"Attributes += methods\", function () {\n    var s, r;\n    beforeEach(function () {\n        s = Snap(100, 100);\n        r = s.rect(10, 10, 50, 50);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    it(\"+=10\", function () {\n        r.attr({x: \"+=10\"});\n        expect(r.node.getAttribute(\"x\")).to.be(\"20\");\n    });\n    it(\"-=10\", function () {\n        r.attr({x: \"-=10\"});\n        expect(r.node.getAttribute(\"x\")).to.be(\"0\");\n    });\n    it(\"*=2\", function () {\n        r.attr({x: \"*=2\"});\n        expect(r.node.getAttribute(\"x\")).to.be(\"20\");\n    });\n    it(\"/=2\", function () {\n        r.attr({x: \"/=2\"});\n        expect(r.node.getAttribute(\"x\")).to.be(\"5\");\n    });\n    it(\"+=1em\", function () {\n        var em = s.rect(0, 0, \"1em\", \"1em\");\n        em = em.getBBox().w;\n        r.attr({x: \"+=1em\"});\n        expect(r.node.getAttribute(\"x\")).to.eql(10 + em);\n    });\n    it(\"-=.3em\", function () {\n        var em = s.rect(0, 0, \"1em\", \"1em\");\n        em = em.getBBox().w;\n        r.attr({x: \"-=.3em\"});\n        expect((+r.node.getAttribute(\"x\")).toFixed(2)).to.eql((10 - em  * .3).toFixed(2));\n    });\n});\n"
  },
  {
    "path": "test/attrs.js",
    "content": "describe(\"Attributes\", function () {\n    var s, r;\n    beforeEach(function () {\n        s = Snap(100, 100);\n        r = s.rect(10, 10, 50, 50);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    function colorTestProp(key) {\n        var o = {};\n        return function () {\n            o[key] = \"#fc0\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"#ffcc00\");\n            expect(r.attr(key)).to.be(\"rgb(255, 204, 0)\");\n            o[key] = \"rgb(255, 204, 0)\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"#ffcc00\");\n            o[key] = \"hsl(0.1333, 1, .5)\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"#ffcc00\");\n            o[key] = \"hsb(0.1333, 1, 1)\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"#ffcc00\");\n            o[key] = \"rgba(255, 204, 0, .5)\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"rgba(255,204,0,0.5)\");\n            o[key] = \"hsla(0.1333, 1, .5, .5)\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"rgba(255,204,0,0.5)\");\n            o[key] = \"hsba(0.1333, 1, 1, .5)\";\n            r.attr(o);\n            expect(r.node.getAttribute(key)).to.be(\"rgba(255,204,0,0.5)\");\n        };\n    }\n    function colorTestStyle(key) {\n        var o = {};\n        return function () {\n            function val() {\n                return Snap.color(r.node.getAttribute(key)).hex;\n            }\n            o[key] = \"#fc0\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n            o[key] = \"rgb(255, 204, 0)\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n            o[key] = \"hsl(0.1333, 1, .5)\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n            o[key] = \"hsb(0.1333, 1, 1)\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n            o[key] = \"rgba(255, 204, 0, .5)\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n            o[key] = \"hsla(0.1333, 1, .5, .5)\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n            o[key] = \"hsba(0.1333, 1, 1, .5)\";\n            r.attr(o);\n            expect(val()).to.be(\"#ffcc00\");\n        };\n    }\n    it(\"sets fill\", colorTestProp(\"fill\"));\n    it(\"sets stroke\", colorTestStyle(\"stroke\"));\n    it(\"circle core attributes\", function () {\n        var c = s.circle(10, 20, 30);\n        expect(c.node.getAttribute(\"cx\")).to.be(\"10\");\n        expect(c.node.getAttribute(\"cy\")).to.be(\"20\");\n        expect(c.node.getAttribute(\"r\")).to.be(\"30\");\n        c.attr({\n            cx: 40,\n            cy: 50,\n            r: \"5%\"\n        });\n        expect(c.node.getAttribute(\"cx\")).to.be(\"40\");\n        expect(c.node.getAttribute(\"cy\")).to.be(\"50\");\n        expect(c.node.getAttribute(\"r\")).to.be(\"5%\");\n    });\n    it(\"rect core attributes\", function () {\n        var c = s.rect(10, 20, 30, 40);\n        expect(c.node.getAttribute(\"x\")).to.be(\"10\");\n        expect(c.node.getAttribute(\"y\")).to.be(\"20\");\n        expect(c.node.getAttribute(\"width\")).to.be(\"30\");\n        expect(c.node.getAttribute(\"height\")).to.be(\"40\");\n        c.attr({\n            x: 40,\n            y: 50,\n            width: \"5%\",\n            height: \"6%\",\n            r: 10\n        });\n        expect(c.node.getAttribute(\"x\")).to.be(\"40\");\n        expect(c.node.getAttribute(\"y\")).to.be(\"50\");\n        expect(c.node.getAttribute(\"width\")).to.be(\"5%\");\n        expect(c.node.getAttribute(\"height\")).to.be(\"6%\");\n        expect(c.node.getAttribute(\"rx\")).to.be(\"10\");\n        expect(c.node.getAttribute(\"ry\")).to.be(\"10\");\n    });\n    it(\"ellipse core attributes\", function () {\n        var c = s.ellipse(10, 20, 30, 40);\n        expect(c.node.getAttribute(\"cx\")).to.be(\"10\");\n        expect(c.node.getAttribute(\"cy\")).to.be(\"20\");\n        expect(c.node.getAttribute(\"rx\")).to.be(\"30\");\n        expect(c.node.getAttribute(\"ry\")).to.be(\"40\");\n        c.attr({\n            cx: 40,\n            cy: 50,\n            rx: \"5%\",\n            ry: \"6%\"\n        });\n        expect(c.node.getAttribute(\"cx\")).to.be(\"40\");\n        expect(c.node.getAttribute(\"cy\")).to.be(\"50\");\n        expect(c.node.getAttribute(\"rx\")).to.be(\"5%\");\n        expect(c.node.getAttribute(\"ry\")).to.be(\"6%\");\n    });\n    it(\"path core attributes\", function () {\n        var c = s.path(\"M10,10 110,10\");\n        expect(c.node.getAttribute(\"d\")).to.be(\"M10,10 110,10\");\n        c.attr({d: \"M10,10 210,10\"});\n        expect(c.node.getAttribute(\"d\")).to.be(\"M10,10 210,10\");\n        c.attr({path: \"M10,10 310,10\"});\n        expect(c.node.getAttribute(\"d\")).to.be(\"M10,10 310,10\");\n    });\n    it(\"text core attributes\", function () {\n        var c = s.text(10, 15, \"testing\");\n        expect(c.node.getAttribute(\"x\")).to.be(\"10\");\n        expect(c.node.getAttribute(\"y\")).to.be(\"15\");\n        expect(c.node.textContent).to.be(\"testing\");\n        c.attr({\n            x: 20,\n            y: 25,\n            text: \"texting\"\n        });\n        expect(c.node.getAttribute(\"x\")).to.be(\"20\");\n        expect(c.node.getAttribute(\"y\")).to.be(\"25\");\n        expect(c.node.textContent).to.be(\"texting\");\n    });\n    it(\"line core attributes\", function () {\n        var c = s.line(10, 15, 110, 17);\n        expect(c.node.getAttribute(\"x1\")).to.be(\"10\");\n        expect(c.node.getAttribute(\"y1\")).to.be(\"15\");\n        expect(c.node.getAttribute(\"x2\")).to.be(\"110\");\n        expect(c.node.getAttribute(\"y2\")).to.be(\"17\");\n        c.attr({\n            x1: 20,\n            y1: 25,\n            x2: 220,\n            y2: 27\n        });\n        expect(c.node.getAttribute(\"x1\")).to.be(\"20\");\n        expect(c.node.getAttribute(\"y1\")).to.be(\"25\");\n        expect(c.node.getAttribute(\"x2\")).to.be(\"220\");\n        expect(c.node.getAttribute(\"y2\")).to.be(\"27\");\n    });\n    it(\"polyline core attributes\", function () {\n        var c = s.polyline(10, 15, 20, 25, 30, 35);\n        expect(c.node.getAttribute(\"points\")).to.be(\"10,15,20,25,30,35\");\n        c.attr({\n            points: [20, 25, 30, 35, 40, 45]\n        });\n        expect(c.node.getAttribute(\"points\")).to.be(\"20,25,30,35,40,45\");\n    });\n    it(\"polygon core attributes\", function () {\n        var c = s.polygon(10, 15, 20, 25, 30, 35);\n        expect(c.node.getAttribute(\"points\")).to.be(\"10,15,20,25,30,35\");\n        c.attr({\n            points: [20, 25, 30, 35, 40, 45]\n        });\n        expect(c.node.getAttribute(\"points\")).to.be(\"20,25,30,35,40,45\");\n    });\n});\n"
  },
  {
    "path": "test/class.js",
    "content": "describe(\"Class methods\", function () {\n    var s, r;\n    beforeEach(function () {\n        s = Snap(100, 100);\n        r = s.rect(10, 10, 50, 50);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    it(\"elproto.addClass one\", function() {\n        r.addClass(\"one\");\n        expect(r.node.className.baseVal).to.be(\"one\");\n    });\n    it(\"elproto.addClass two\", function() {\n        r.addClass(\"one two\");\n        expect(r.node.className.baseVal).to.be(\"one two\");\n    });\n    it(\"elproto.addClass two (spacing)\", function() {\n        r.addClass(\"\\tone   two \");\n        expect(r.node.className.baseVal).to.be(\"one two\");\n    });\n    it(\"elproto.addClass three\", function() {\n        r.addClass(\"one  two three\");\n        expect(r.node.className.baseVal).to.be(\"one two three\");\n    });\n    it(\"elproto.removeClass 1\", function() {\n        r.addClass(\"one  two three\");\n        r.removeClass(\"two\");\n        expect(r.node.className.baseVal).to.be(\"one three\");\n    });\n    it(\"elproto.removeClass 2\", function() {\n        r.addClass(\"one  two three\");\n        r.removeClass(\"two one\");\n        expect(r.node.className.baseVal).to.be(\"three\");\n    });\n    it(\"elproto.hasClass\", function() {\n        r.addClass(\"one  two three\");\n        expect(r.hasClass(\"two\")).to.be(true);\n    });\n    it(\"elproto.toggleClass 1\", function() {\n        r.addClass(\"one  two three\");\n        r.toggleClass(\"two one\");\n        expect(r.node.className.baseVal).to.be(\"three\");\n    });\n    it(\"elproto.toggleClass 2\", function() {\n        r.addClass(\"one  three\");\n        r.toggleClass(\"two one\", false);\n        expect(r.node.className.baseVal).to.be(\"three\");\n    });\n    it(\"elproto.toggleClass 3\", function() {\n        r.addClass(\"one three\");\n        r.toggleClass(\"two one\", true);\n        expect(r.node.className.baseVal).to.be(\"one three two\");\n    });\n});"
  },
  {
    "path": "test/colors.js",
    "content": "describe(\"Colours\", function () {\n    it(\"parses hex colour\", function () {\n        expect(Snap.color(\"#fC0\").hex).to.be(\"#ffcc00\");\n    });\n    it(\"parses RGB\", function () {\n        var c = Snap.color(\"rgb(255, 204, 0)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.r).to.be(255);\n        expect(c.g).to.be(204);\n        expect(c.b).to.be(0);\n    });\n    it(\"parses RGB - %\", function () {\n        var c = Snap.color(\"rgb(100%, 80%, 0%)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.r).to.be(255);\n        expect(c.g).to.be(204);\n        expect(c.b).to.be(0);\n    });\n    it(\"parses HSL\", function () {\n        var c = Snap.color(\"hsl(0.1333, 1, .5)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.h.toFixed(3)).to.be(\"0.133\");\n        expect(c.s).to.be(1);\n        expect(c.l).to.be(.5);\n    });\n    it(\"parses HSL - %\", function () {\n        var c = Snap.color(\"hsl(13.33%, 100%, 50%)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.h.toFixed(3)).to.be(\"0.133\");\n        expect(c.s).to.be(1);\n        expect(c.l).to.be(.5);\n    });\n    it(\"parses HSB\", function () {\n        var c = Snap.color(\"hsb(0.1333, 1, 1)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.h.toFixed(3)).to.be(\"0.133\");\n        expect(c.s).to.be(1);\n        expect(c.v).to.be(1);\n    });\n    it(\"parses HSB - %\", function () {\n        var c = Snap.color(\"hsb(13.33%, 100%, 100%)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.h.toFixed(3)).to.be(\"0.133\");\n        expect(c.s).to.be(1);\n        expect(c.v).to.be(1);\n    });\n    it(\"parses RGBA\", function () {\n        var c = Snap.color(\"rgba(255, 204, 0, .75)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.r).to.be(255);\n        expect(c.g).to.be(204);\n        expect(c.b).to.be(0);\n        expect(c.opacity).to.be(.75);\n    });\n    it(\"parses HSLA\", function () {\n        var c = Snap.color(\"hsla(0.1333, 1, .5, .5)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.r).to.be(255);\n        expect(c.g).to.be(204);\n        expect(c.b).to.be(0);\n        expect(c.opacity).to.be(.5);\n    });\n    it(\"parses HSBA\", function () {\n        var c = Snap.color(\"hsba(0.1333, 1, 1, .5)\");\n        expect(c.hex).to.be(\"#ffcc00\");\n        expect(c.r).to.be(255);\n        expect(c.g).to.be(204);\n        expect(c.b).to.be(0);\n        expect(c.opacity).to.be(.5);\n    });\n    it(\"parses names\", function () {\n        var c = Snap.color(\"DodgerBlue\");\n        expect(c.hex).to.be(\"#1e90ff\");\n        c = Snap.color(\"FireBrick\");\n        expect(c.hex).to.be(\"#b22222\");\n        c = Snap.color(\"MintCream\");\n        expect(c.hex).to.be(\"#f5fffa\");\n    });\n    it(\"parses to RGB\", function() {\n        var expectRGB = function(str) {\n            var c = Snap.getRGB(str);\n            expect(c.hex).to.be(\"#ffcc00\");\n            expect(c.r).to.be(255);\n            expect(c.g).to.be(204);\n            expect(c.b).to.be(0);\n            expect(c.error).to.not.be(true);\n        };\n        \n        expectRGB(\"#fc0\");\n        expectRGB(\"#ffcc00\");\n        expectRGB(\"rgb(255, 204, 0)\");\n        expectRGB(\"rgb(100%, 80%, 0%)\");\n        expectRGB(\"hsb(0.1333, 1, 1)\");\n        expectRGB(\"hsb(13.33%, 100%, 100%)\");\n        expectRGB(\"hsl(0.1333, 1, .5)\");\n        expectRGB(\"hsl(13.33%, 100%, 50%)\");\n        expectRGB(\"rgba(255, 204, 0, .75)\");\n        expectRGB(\"hsla(0.1333, 1, .5, .5)\");\n        expectRGB(\"hsba(0.1333, 1, 1, .5)\");\n        var c = Snap.getRGB(\"DodgerBlue\");\n        expect(c.hex).to.be(\"#1e90ff\");\n        expect(c.r).to.be(30);\n        expect(c.g).to.be(144);\n        expect(c.b).to.be(255);\n        expect(c.error).to.not.be(true);\n        c = Snap.getRGB(\"foobar\");\n        expect(!!c.error).to.be(true);\n        c = Snap.getRGB(\"#zzz\");\n        expect(!!c.error).to.be(true);\n        c = Snap.getRGB(\"rgb(255)\");\n        expect(!!c.error).to.be(true);\n        c = Snap.getRGB(\"hsl(0, 0, 0\");\n        expect(!!c.error).to.be(true);\n        c = Snap.getRGB(\"rab(0, 0, 0)\");\n        expect(!!c.error).to.be(true);\n    });\n    it(\"creates hsb\", function() {\n        var str = Snap.hsb(0.13333, 1, 1);\n        expect(str).to.be(\"#ffcc00\");\n        str = Snap.hsb(0, 0.5, 0.5);\n        expect(str).to.be(\"#804040\");\n    });\n    it(\"creates rgb from hsb\", function() {\n        var rgb = Snap.hsb2rgb(0.13333, 1, 1);\n        expect(rgb.r).to.be(255);\n        expect(rgb.g).to.be(204);\n        expect(rgb.b).to.be(0);\n        expect(rgb.hex).to.be(\"#ffcc00\");\n        rgb = Snap.hsb2rgb(0, 0.5, 0.5);\n        expect(rgb.r).to.be(128);\n        expect(rgb.g).to.be(64);\n        expect(rgb.b).to.be(64);\n        expect(rgb.hex).to.be(\"#804040\");\n    });\n    it(\"creates hsl\", function() {\n        var str = Snap.hsl(0.13333, 1, 0.5);\n        expect(str).to.be(\"#ffcc00\");\n        str = Snap.hsl(0, 1, 0.75);\n        expect(str).to.be(\"#ff8080\");\n    });\n    it(\"creates rgb from hsl\", function() {\n        var rgb = Snap.hsl2rgb(0.13333, 1, 0.5);\n        expect(rgb.r).to.be(255);\n        expect(rgb.g).to.be(204);\n        expect(rgb.b).to.be(0);\n        expect(rgb.hex).to.be(\"#ffcc00\");\n        rgb = Snap.hsl2rgb(0, 1, 0.75);\n        expect(rgb.r).to.be(255);\n        expect(rgb.g).to.be(128);\n        expect(rgb.b).to.be(128);\n        expect(rgb.hex).to.be(\"#ff8080\");\n    });\n    it(\"creates rgb\", function() {\n        var str = Snap.rgb(255, 204, 0);\n        expect(str).to.be(\"#ffcc00\");\n        str = Snap.rgb(64, 128, 255);\n        expect(str).to.be(\"#4080ff\");\n    });\n    it(\"creates hsb from rgb\", function() {\n        var hsb = Snap.rgb2hsb(255, 204, 0);\n        expect(hsb.h.toFixed(3)).to.be(\"0.133\");\n        expect(hsb.s).to.be(1);\n        expect(hsb.b).to.be(1);\n        hsb = Snap.rgb2hsb(128, 64, 64);\n        expect(hsb.h).to.be(0);\n        expect(hsb.s.toFixed(1)).to.be(\"0.5\");\n        expect(hsb.b.toFixed(1)).to.be(\"0.5\");\n    });\n    it(\"creates hsl from rgb\", function() {\n        var hsl = Snap.rgb2hsl(255, 204, 0);\n        expect(hsl.h.toFixed(3)).to.be(\"0.133\");\n        expect(hsl.s).to.be(1);\n        expect(hsl.l).to.be(0.5);\n        hsl = Snap.rgb2hsl(255, 128, 128);\n        expect(hsl.h).to.be(0);\n        expect(hsl.s).to.be(1);\n        expect(hsl.l.toFixed(2)).to.be(\"0.75\");\n    });\n});\n"
  },
  {
    "path": "test/element.js",
    "content": "describe(\"Element methods\", function () {\n    var s;\n    beforeEach(function () {\n        s = Snap(100, 100);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    \n    /* \n    DOM manipulation:\n        - add/append\n        - prepend\n        - after\n        - insertAfter\n        - before\n        - insertBefore\n        - clone\n        - parent\n        - remove\n    */\n    it(\"Element.add (for Element)\", function () {\n        var rect = s.rect(10, 20, 30, 40);\n        var result = s.add(rect);\n        expect(rect.node.parentNode).to.be(s.node);\n        expect(s.node.lastChild).to.be(rect.node);\n        expect(result).to.be(s);\n    });\n    it(\"Element.add (for Set)\", function () {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2);\n        var result = s.add(set);\n        expect(rect1.node.parentNode).to.be(s.node);\n        expect(rect2.node.parentNode).to.be(s.node);\n        expect(result).to.be(s);\n    });\n    it(\"Element.append (for Element)\", function () {\n        var rect = s.rect(10, 20, 30, 40);\n        var result = s.append(rect);\n        expect(rect.node.parentNode).to.be(s.node);\n        expect(s.node.lastChild).to.be(rect.node);\n        expect(result).to.be(s);\n    });\n    it(\"Element.appendTo (for Element)\", function () {\n        var rect = s.rect(10, 20, 30, 40);\n        var result = rect.appendTo(s);\n        expect(rect.node.parentNode).to.be(s.node);\n        expect(s.node.lastChild).to.be(rect.node);\n        expect(result).to.be(rect);\n    });\n    it(\"Element.append (for Set)\", function () {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2);\n        var result = s.append(set);\n        expect(rect1.node.parentNode).to.be(s.node);\n        expect(rect2.node.parentNode).to.be(s.node);\n        expect(result).to.be(s);\n    });\n    it(\"Element.after\", function() {\n        var circle = s.circle(10, 20, 30);\n        var rect = s.rect(10, 20, 30, 40);\n        var result = circle.after(rect);\n        expect(circle.node.nextSibling).to.be(rect.node);\n        expect(result).to.be(circle);\n    });\n    it(\"Element.prepend\", function() {\n        var rect = s.rect(10, 20, 30, 40);\n        var circle = s.circle(10, 20, 30);\n        var group = s.group();\n        s.append(group);\n        var result = group.prepend(rect);\n        expect(group.node.firstChild).to.be(rect.node);\n        expect(result).to.be(group);\n        result = group.prepend(circle);\n        expect(group.node.firstChild).to.be(circle.node);\n        expect(result).to.be(group);\n    });\n    it(\"Element.prependTo\", function() {\n        var rect = s.rect(10, 20, 30, 40);\n        var circle = s.circle(10, 20, 30);\n        var group = s.group();\n        s.append(group);\n        var result = rect.prependTo(group);\n        expect(group.node.firstChild).to.be(rect.node);\n        expect(result).to.be(rect);\n        result = circle.prependTo(group);\n        expect(group.node.firstChild).to.be(circle.node);\n        expect(result).to.be(circle);\n    });\n    it(\"Element.insertAfter\", function() {\n        var circle = s.circle(10, 20, 30);\n        var rect = s.rect(10, 20, 30, 40);\n        var result = rect.insertAfter(circle);\n        expect(circle.node.nextSibling).to.be(rect.node);\n        expect(result).to.be(rect);\n    });\n    it(\"Element.before\", function() {\n        var circle = s.circle(10, 20, 30);\n        var rect = s.rect(10, 20, 30, 40);\n        var result = circle.before(rect);\n        expect(circle.node.previousSibling).to.be(rect.node);\n        expect(result).to.be(circle);\n    });\n    it(\"Element.insertBefore\", function() {\n        var circle = s.circle(10, 20, 30);\n        var rect = s.rect(10, 20, 30, 40);\n        var result = rect.insertBefore(circle);\n        expect(circle.node.previousSibling).to.be(rect.node);\n        expect(result).to.be(rect);\n    });\n    it(\"Element.clone\", function() {\n        var circle = s.circle(10, 20, 30);\n        s.append(circle);\n        var clone = circle.clone();\n        expect(circle.node).not.to.be(clone.node);\n        expect(clone.node.getAttribute(\"cx\")).to.be(\"10\");\n        expect(clone.node.getAttribute(\"cy\")).to.be(\"20\");\n        expect(clone.node.getAttribute(\"r\")).to.be(\"30\");\n    });\n    it(\"Element.parent\", function() {\n        var circle = s.circle(10, 20, 30);\n        s.append(circle);\n        var parent = circle.parent();\n        expect(parent.node).to.be(s.node);\n    });\n    it(\"Element.remove\", function() {\n        var rect = s.rect(10, 20, 30, 40);\n        expect(rect.node.parentNode).to.be(s.node);\n        var result = rect.remove();\n        expect(rect.node.parentNode).to.be(null);\n        expect(result).to.be(rect);\n    });\n    \n    /*\n    Set/get data:\n        Element.attr()\n        Element.data()\n        Element.removeData()\n        Element.asPX()\n        Element.getBBox()\n        Element.getPointAtLength()\n        Element.getSubpath()\n        Element.getTotalLength()\n        Element.innerSVG()\n        Element.toString()\n    */\n    \n    it(\"Element.attr - get\", function() {\n        var circle = s.circle(10, 20, 30);\n        var r = circle.attr(\"r\");\n        expect(r).to.be(\"30\");\n    });\n    it(\"Element.attr - set\", function() {\n        var circle = s.circle(10, 20, 30);\n        circle.attr({\n            cx: 1,\n            cy: 2,\n            r: 3\n        });\n        var cx = circle.node.getAttribute(\"cx\");\n        var cy = circle.node.getAttribute(\"cy\");\n        var r = circle.node.getAttribute(\"r\");\n        expect(cx).to.be(\"1\");\n        expect(cy).to.be(\"2\");\n        expect(r).to.be(\"3\");\n    });\n    it(\"Element.attr - set on group\", function() {\n        var group = s.group();\n        group.attr({'class': 'myclass'});\n        expect(group.node.getAttribute('class')).to.be('myclass');\n    });\n    it(\"Element.attr - textPath\", function() {\n        var txt = s.text(20, 20, \"test\");\n        txt.attr({textpath: \"M10,20L100,100\"});\n        expect(txt.node.firstChild.tagName).to.be(\"textPath\");\n    });\n    it(\"Element.attr - textPath\", function() {\n        var txt = s.text(20, 20, \"test\"),\n            pth = s.path(\"M10,20L100,100\");\n        txt.attr({textpath: pth});\n        expect(txt.node.firstChild.tagName).to.be(\"textPath\");\n    });\n    it(\"Element.data\", function() {\n        var circle = s.circle(10, 20, 30);\n        circle.data(\"foo\", \"bar\");\n        var data = circle.data(\"foo\");\n        expect(data).to.be(\"bar\");\n        var myObject = {};\n        circle.data(\"my-object\", myObject);\n        data = circle.data(\"my-object\");\n        expect(data).to.be(myObject);\n    });\n    it(\"Element.removeData - with key\", function() {\n        var circle = s.circle(10, 20, 30);\n        var myObject = {};\n        circle.data(\"my-object\", myObject);\n        var data = circle.data(\"my-object\");\n        expect(data).to.be(myObject);\n        circle.removeData(\"my-object\");\n        data = circle.data(\"my-object\");\n        expect(data).to.be(undefined);\n    });\n    it(\"Element.removeData - no key\", function() {\n        var circle = s.circle(10, 20, 30);\n        var myObject = {};\n        var myNumber = 42;\n        circle.data(\"my-object\", myObject);\n        circle.data(\"my-number\", 42);\n        expect(circle.data(\"my-object\")).to.be(myObject);\n        expect(circle.data(\"my-number\")).to.be(myNumber);\n        circle.removeData();\n        expect(circle.data(\"my-object\")).to.be(undefined);\n        expect(circle.data(\"my-number\")).to.be(undefined);\n    });\n    it(\"Element.asPX - from %\", function() {\n        s.attr({width: 200});\n        var rect = s.rect(0, 0, \"100%\", 10);\n        var widthAsPx = rect.asPX(\"width\");\n        expect(widthAsPx).to.be(200);\n    });\n    it(\"Element.getBBox\", function() {\n        var rect = s.rect(10, 20, 30, 40),\n            bbox = rect.getBBox(),\n            line = s.line(10, 20, 40, 60),\n            lbbx = line.getBBox();\n\n        expect(bbox.x).to.eql(10);\n        expect(bbox.y).to.eql(20);\n        expect(bbox.w).to.eql(30);\n        expect(bbox.width).to.eql(30);\n        expect(bbox.h).to.eql(40);\n        expect(bbox.height).to.eql(40);\n        expect(bbox.x2).to.eql(10 + 30);\n        expect(bbox.cx).to.eql(10 + 30 / 2);\n        expect(bbox.cy).to.eql(20 + 40 / 2);\n        expect(bbox.y2).to.eql(20 + 40);\n        expect(bbox).to.eql(lbbx);\n    });\n    \n    it(\"Element.getPointAtLength\", function() {\n        var path = s.path(\"M0,0 100,0\");\n        expect(path.getPointAtLength(50)).to.eql({\n            x: 50,\n            y: 0,\n            m: {\n                x: 25,\n                y: 0\n            },\n            n: {\n                x: 75,\n                y: 0\n            },\n            start: {\n                x: 0,\n                y: 0\n            },\n            end: {\n                x: 100,\n                y: 0\n            },\n            alpha: 180\n        }); \n    });\n    it(\"Element.getSubpath\", function() {\n        var path = s.path(\"M0,0 100,0\");\n        expect(path.getSubpath(10, 90)).to.be(\"M9.995,0C29.153,0,70.839,0,90,0\");\n    });\n    it(\"Element.getTotalLength\", function() {\n        var path = s.path(\"M0,0 100,0\");\n        expect(+path.getTotalLength(\"M0,0 100,0\").toFixed(2)).to.be(100);\n    });\n    it(\"Element.innerSVG\", function() {\n        var group1 = s.group().attr({\n            'class': 'group-one'\n        });\n        var group2 = s.group().attr({\n            'class': 'group-two'\n        });\n        \n        var group3 = s.group().attr({\n            'class': 'group-three'\n        });\n        \n        var circle1 = s.circle(10, 20, 30).attr({\n            'class': 'circle-one'\n        });\n        var circle2 = s.circle(5, 10, 25).attr({\n            'class': 'circle-two'\n        });\n        group1.add(group2);\n        group2.add(group3);\n        group2.add(circle1);\n        group3.add(circle2);\n        var innerSVG = group1.innerSVG();\n        expect(innerSVG).to.match(/<g .*?class=\"group-two\".*?>\\w*<g .*?class=\"group-three\".*?>\\w*<circle .*?class=\"circle-two\".*?>\\w*<circle .*?class=\"circle-one\".*?>/);\n    });\n    it(\"Element.toString\", function() {\n        var group1 = s.group();\n        var circle1 = s.circle(10, 20, 30).attr({\n            'class': 'circle-one'\n        });\n        group1.add(circle1);\n        var str = group1.toString();\n        expect(str).to.match(/<g.*?>\\w*<circle .*?class=\"circle-one\".*?>\\w*<\\/g>/);\n    });\n    \n    /*\n        Misc: \n        \n        Element.select()\n        Element.selectAll()\n        Element.animate()\n        Element.inAnim()\n        Element.stop()\n        Element.marker()\n        Element.pattern()\n        Element.use()\n        Element.transform()\n        Element.toDefs()\n    */\n    \n    it(\"Element.select\", function() {\n        var group1 = s.group();\n        var group2 = s.group();\n        var group3 = s.group();\n        var circle1 = s.circle(10, 20, 30).attr({\n            'class': 'circle-one'\n        });\n        var circle2 = s.circle(5, 10, 25).attr({\n            'class': 'circle-two'\n        });\n        group1.add(group2);\n        group2.add(group3);\n        group2.add(circle1);\n        group3.add(circle2);\n        var c1 = group1.select('.circle-one');\n        expect(circle1).to.be(c1);\n        var c2 = group1.select('.circle-two');\n        expect(circle2).to.be(c2);\n    });\n    it(\"Element.selectAll\", function() {\n        var group1 = s.group();\n        var group2 = s.group();\n        var group3 = s.group();\n        var circle1 = s.circle(10, 20, 30).attr({\n            'class': 'circle-one'\n        });\n        var circle2 = s.circle(5, 10, 25).attr({\n            'class': 'circle-two'\n        });\n        group1.add(group2);\n        group2.add(group3);\n        group2.add(circle1);\n        group3.add(circle2);\n        var circles = group1.selectAll('circle');\n        expect(circles.length).to.be(2);\n        expect(circles).to.contain(circle1);\n        expect(circles).to.contain(circle2);\n    });\n    it(\"Element.animate\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var result = circle.animate({r: 50}, 10);\n        setTimeout(function() {\n            var r = circle.attr(\"r\");\n            expect(r).to.be(\"50\");\n            done();\n        }, 50);\n        expect(result).to.be(circle);\n    });    \n    it(\"Element.animate - with callback\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var result = circle.animate({r: 50}, 10, function() {\n            var r = circle.attr(\"r\");\n            expect(r).to.be(\"50\");\n            done();\n        });\n        expect(result).to.be(circle);\n    });\n    it(\"Element.animate - with easing\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var result = circle.animate({r: 50}, 10, mina.easein);\n        setTimeout(function() {\n            var r = circle.attr(\"r\");\n            expect(r).to.be(\"50\");\n            done();\n        }, 50);\n        expect(result).to.be(circle);\n    });\n    it(\"Element.animate - with callback & easing\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var result = circle.animate({r: 50}, 10, mina.easeout, function() {\n            var r = circle.attr(\"r\");\n            expect(r).to.be(\"50\");\n            done();\n        });\n        expect(result).to.be(circle);\n    });\n    it(\"Element.inAnim\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        circle.animate({r: 50}, 100);\n        circle.animate({cx: 100}, 100);\n        setTimeout(function() {\n            var inAnimArr = circle.inAnim();\n            expect(inAnimArr).to.be.an('array');\n            expect(inAnimArr.length).to.be(2);\n            expect(inAnimArr[0].anim).to.be.an('object');\n            expect(inAnimArr[0].curStatus).to.be.a('number');\n            expect(inAnimArr[0].curStatus).to.be.within(0.01, 0.99);\n            expect(inAnimArr[0].status).to.be.a('function');\n            expect(inAnimArr[0].stop).to.be.a('function');\n            done();\n        }, 50);\n    });\n    it(\"Element.stop\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        circle.animate({r: 50}, 100);\n        setTimeout(function() {\n            var inAnimArr = circle.inAnim();\n            expect(inAnimArr.length).to.be(1);\n            var result = circle.stop();\n            inAnimArr = circle.inAnim();\n            expect(inAnimArr.length).to.be(0);\n            var r = circle.attr(\"r\");\n            expect(r).to.be.lessThan(50);\n            expect(result).to.be(circle);\n            done();\n        }, 50);\n    });\n    it(\"Element.marker\", function() {\n        var line = s.line(0, 0, 10, 10);\n        var marker = line.marker(0, 0, 5, 5, 0, 0);\n        expect(marker.node.nodeName).to.be(\"marker\");\n        expect(marker.node.getAttribute(\"viewBox\")).to.be(\"0 0 5 5\");\n        expect(marker.node.getAttribute(\"markerWidth\")).to.be(\"5\");\n        expect(marker.node.getAttribute(\"markerHeight\")).to.be(\"5\");\n        expect(marker.node.getAttribute(\"refX\")).to.be(\"0\");\n        expect(marker.node.getAttribute(\"refY\")).to.be(\"0\");\n    });\n    it(\"Element.pattern\", function() {\n        var circle = s.circle(10, 20, 30);\n        var pattern = circle.pattern(0, 0, 50, 50);\n        expect(pattern.node.nodeName).to.be('pattern');\n    });\n    it(\"Element.transform\", function() {\n        var circle = s.circle(10, 20, 30);\n        var result = circle.transform(\"translate(10,10)\");\n        var matrix = {\n            a: 1, b: 0, c: 0, d: 1, e: 10, f: 10\n        };\n        var transform = circle.transform();\n        expect(transform.string).to.be.a('string');\n        expect(transform.global).to.be.a('string');\n        expect(transform.globalMatrix).to.be.an('object');\n        expect(transform.globalMatrix).to.eql(matrix);\n        expect(transform.local).to.be.a('string');\n        expect(transform.localMatrix).to.be.an('object');\n        expect(transform.localMatrix).to.eql(matrix);\n        circle.transform(\"rotate(90)\");\n        transform = circle.transform();\n        expect(transform.local).to.be(\"r90,0,0\");\n        expect(result).to.be(circle);\n        circle.transform(\"translate(10)\");\n        matrix = {\n            a: 1, b: 0, c: 0, d: 1, e: 10, f: 0\n        };\n        transform = circle.transform();\n        expect(transform.globalMatrix).to.eql(matrix);\n    });\n    it(\"Element.use\", function() {\n        var circle = s.circle(10, 20, 30);\n        var use = circle.use();\n        expect(use.node.nodeName).to.be('use');\n    });\n     it(\"Element.toDefs\", function() {\n        var circle = s.circle(10, 20, 30);\n        var result = circle.toDefs();\n        expect(circle.node.parentElement.nodeName).to.be('defs');\n        expect(result).to.be(circle);\n    });   \n        \n    /*\n        Event binding & unbinding: \n        \n            Element.click()\n            Element.dblclick()\n            Element.mousedown()\n            Element.mousemove()\n            Element.mouseout()\n            Element.mouseover()\n            Element.mouseup()\n            Element.touchcancel()\n            Element.touchend()\n            Element.touchmove()\n            Element.touchstart()\n            Element.unclick()\n            Element.undblclick()\n            Element.unmousedown()\n            Element.unmousemove()\n            Element.unmouseout()\n            Element.unmouseover()\n            Element.unmouseup()\n            Element.untouchcancel()\n            Element.untouchend()\n            Element.untouchmove()\n            Element.untouchstart()\n\n            Element.drag()\n            Element.undrag()\n            Element.onDragOver()\n            Element.hover()\n            Element.unhover()\n    */\n      \n    // Helper function to simulate event triggering\n    var triggerEvent = function(savageEl, eventType) {\n        var event = document.createEvent(\"HTMLEvents\");\n        event.initEvent(eventType, true, true);\n        savageEl.node.dispatchEvent(event);\n    };\n    \n    // Generate tests for all standard DOM events\n    (function() {\n        var elementEvents = [\n            \"click\",\n            \"dblclick\",\n            \"mousedown\",\n            \"mousemove\",\n            \"mouseout\",\n            \"mouseover\",\n            \"mouseup\",\n            \"touchcancel\",\n            \"touchend\",\n            \"touchmove\",\n            \"touchstart\"\n        ];\n        \n        var makeEventTest = function(eventName) {\n            return function() {\n                // Add event, trigger event, remove event, trigger again\n                var circle = s.circle(10, 20, 30);\n                var n = 0;\n                var fn = function() {\n                    n++;\n                };\n                var result1 = circle[eventName](fn);\n                expect(n).to.be(0);\n                triggerEvent(circle, eventName);\n                expect(n).to.be(1);\n                var result2 = circle[\"un\" + eventName](fn);\n                triggerEvent(circle, eventName);\n                expect(n).to.be(1);\n                expect(result1).to.be(circle);\n                expect(result2).to.be(circle);\n            };\n        };\n        \n        for (var i = 0; i < elementEvents.length; i++) {\n            var eventName = elementEvents[i];\n            var testName = \"Element.\" + eventName + \", Element.un\" + eventName;\n            var testFunc = makeEventTest(eventName);\n            it(testName, testFunc);\n        }\n    }());\n    it(\"Element.drag, Element.undrag - no contexts\", function() {\n        var circle = s.circle(10, 20, 30);\n        var moved = 0;\n        var started = 0;\n        var ended = 0;\n        var result1 = circle.drag(function(dx, dy, x, y, event) {\n            moved++;\n            expect(dx).to.be.a('number');\n            expect(dy).to.be.a('number');\n            expect(x).to.be.a('number');\n            expect(y).to.be.a('number');\n            expect(event).to.be.an('object');\n        }, function(x, y, event) {\n            started++;\n            expect(x).to.be.a('number');\n            expect(y).to.be.a('number');\n            expect(event).to.be.an('object');\n        }, function(event) {\n            ended++;\n            expect(event).to.be.an('object');\n        });\n        \n        expect(started).to.be(0);\n        triggerEvent(circle, 'mousedown');\n        expect(started).to.be(1);\n        expect(moved).to.be(0);\n        triggerEvent(circle, 'mousemove');\n        expect(moved).to.be(1);\n        expect(ended).to.be(0);\n        triggerEvent(circle, 'mouseup');\n        expect(ended).to.be(1);\n        expect(result1).to.be(circle);\n        \n        var result2 = circle.undrag();\n        triggerEvent(circle, 'mousedown');\n        expect(started).to.be(1);\n        triggerEvent(circle, 'mousemove');\n        expect(moved).to.be(1);\n        triggerEvent(circle, 'mouseup');\n        expect(ended).to.be(1);\n        // expect(result2).to.be(circle); // TODO: Make undrag return element\n    });\n    it(\"Element.drag - with contexts\", function() {\n        var circle = s.circle(10, 20, 30);\n        var moved = 0;\n        var started = 0;\n        var ended = 0;\n        var result = circle.drag(function(dx, dy, x, y, event) {\n            moved++;\n            expect(dx).to.be.a('number');\n            expect(dy).to.be.a('number');\n            expect(x).to.be.a('number');\n            expect(y).to.be.a('number');\n            expect(event).to.be.an('object');\n            expect(this.moveContext).to.be(true);\n        }, function(x, y, event) {\n            started++;\n            expect(x).to.be.a('number');\n            expect(y).to.be.a('number');\n            expect(event).to.be.an('object');\n            expect(this.startContext).to.be(true);\n        }, function(event) {\n            ended++;\n            expect(event).to.be.an('object');\n            expect(this.endContext).to.be(true);\n        }, {moveContext: true}, {startContext: true}, {endContext: true});\n        \n        expect(started).to.be(0);\n        triggerEvent(circle, 'mousedown');\n        expect(started).to.be(1);\n        expect(moved).to.be(0);\n        triggerEvent(circle, 'mousemove');\n        expect(moved).to.be(1);\n        expect(ended).to.be(0);\n        triggerEvent(circle, 'mouseup');\n        expect(ended).to.be(1);\n        expect(result).to.be(circle);\n        \n        var result2 = circle.undrag();\n        triggerEvent(circle, 'mousedown');\n        expect(started).to.be(1);\n        triggerEvent(circle, 'mousemove');\n        expect(moved).to.be(1);\n        triggerEvent(circle, 'mouseup');\n        expect(ended).to.be(1);\n        // expect(result2).to.be(circle); // TODO: Make undrag return element\n    });\n    \n    \n    it(\"Element.hover, Element.unhover - no contexts\", function() {\n        var circle = s.circle(10, 20, 30);\n        var eventIn = 0;\n        var eventOut = 0;\n        var result1 = circle.hover(function() {\n            eventIn++;\n        }, function() {\n            eventOut++;\n        });\n        \n        expect(eventIn).to.be(0);\n        triggerEvent(circle, 'mouseover');\n        expect(eventIn).to.be(1);\n        expect(eventOut).to.be(0);\n        triggerEvent(circle, 'mouseout');\n        expect(eventOut).to.be(1);\n        expect(result1).to.be(circle);\n        \n        var result2 = circle.unhover();\n        triggerEvent(circle, 'mouseover');\n        expect(eventIn).to.be(1);\n        triggerEvent(circle, 'mouseout');\n        expect(eventOut).to.be(1);\n        expect(result2).to.be(circle);\n    });\n    it(\"Element.hover, Element.unhover - with contexts\", function() {\n        var circle = s.circle(10, 20, 30);\n        var eventIn = 0;\n        var eventOut = 0;\n        var result1 = circle.hover(function() {\n            eventIn++;\n            expect(this.inContext).to.be(true);\n        }, function() {\n            eventOut++;\n            expect(this.outContext).to.be(true);\n        }, {inContext: true}, {outContext: true});\n        \n        expect(eventIn).to.be(0);\n        triggerEvent(circle, 'mouseover');\n        expect(eventIn).to.be(1);\n        expect(eventOut).to.be(0);\n        triggerEvent(circle, 'mouseout');\n        expect(eventOut).to.be(1);\n        expect(result1).to.be(circle);\n        \n        var result2 = circle.unhover();\n        triggerEvent(circle, 'mouseover');\n        expect(eventIn).to.be(1);\n        triggerEvent(circle, 'mouseout');\n        expect(eventOut).to.be(1);\n        expect(result2).to.be(circle);\n    });\n    it(\"Snap.getElementByPoint\", function() {\n        var rect = s.rect(10, 10, 30, 30).attr({id: \"id\"});\n        var res1 = Snap.getElementByPoint(15, 15);\n        var res2 = Snap.getElementByPoint(45, 45);\n        expect(res1.node.id).to.be(\"id\");\n        expect(res2.node.id).to.not.be(\"id\");\n    });\n});\n"
  },
  {
    "path": "test/filter.js",
    "content": "describe(\"Filter methods\", function () {\n    it(\"Snap.filter.blur\", function() {\n        var str = Snap.filter.blur(3);\n        expect(str).to.be('<feGaussianBlur stdDeviation=\"3\"/>');\n        str = Snap.filter.blur(0.123, 8);\n        expect(str).to.be('<feGaussianBlur stdDeviation=\"0.123,8\"/>');\n    });\n    it(\"Snap.filter.brightness\", function() {\n        var str = Snap.filter.brightness(0.3);\n        expect(str).to.be('<feComponentTransfer><feFuncR type=\"linear\" slope=\"0.3\"/><feFuncG type=\"linear\" slope=\"0.3\"/><feFuncB type=\"linear\" slope=\"0.3\"/></feComponentTransfer>');\n        str = Snap.filter.brightness(1);\n        expect(str).to.be('<feComponentTransfer><feFuncR type=\"linear\" slope=\"1\"/><feFuncG type=\"linear\" slope=\"1\"/><feFuncB type=\"linear\" slope=\"1\"/></feComponentTransfer>');\n    });\n    it(\"Snap.filter.contrast\", function() {\n        var str = Snap.filter.contrast(0.1);\n        expect(str).to.be('<feComponentTransfer><feFuncR type=\"linear\" slope=\"0.1\" intercept=\"0.45\"/><feFuncG type=\"linear\" slope=\"0.1\" intercept=\"0.45\"/><feFuncB type=\"linear\" slope=\"0.1\" intercept=\"0.45\"/></feComponentTransfer>');\n        str = Snap.filter.contrast(3);\n        expect(str).to.be('<feComponentTransfer><feFuncR type=\"linear\" slope=\"3\" intercept=\"-1\"/><feFuncG type=\"linear\" slope=\"3\" intercept=\"-1\"/><feFuncB type=\"linear\" slope=\"3\" intercept=\"-1\"/></feComponentTransfer>');\n    });\n    it(\"Snap.filter.grayscale\", function() {\n        var str = Snap.filter.grayscale(0.5);\n        expect(str).to.be('<feColorMatrix type=\"matrix\" values=\"0.6063000000000001 0.3576 0.0361 0 0 0.1063 0.8575999999999999 0.0361 0 0 0.1063 0.3576 0.5361 0 0 0 0 0 1 0\"/>');\n        str = Snap.filter.grayscale(1);\n        expect(str).to.be('<feColorMatrix type=\"matrix\" values=\"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\"/>');\n    });\n    it(\"Snap.filter.hueRotate\", function() {\n        var str = Snap.filter.hueRotate(180);\n        expect(str).to.be('<feColorMatrix type=\"hueRotate\" values=\"180\"/>');\n        str = Snap.filter.hueRotate(90);\n        expect(str).to.be('<feColorMatrix type=\"hueRotate\" values=\"90\"/>');\n    });\n    it(\"Snap.filter.hueRotate\", function() {\n        var str = Snap.filter.hueRotate(180);\n        expect(str).to.be('<feColorMatrix type=\"hueRotate\" values=\"180\"/>');\n        str = Snap.filter.hueRotate(90);\n        expect(str).to.be('<feColorMatrix type=\"hueRotate\" values=\"90\"/>');\n    });\n    it(\"Snap.filter.invert\", function() {\n        var str = Snap.filter.invert(0.6);\n        expect(str).to.be('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"0.6 0.4\"/><feFuncG type=\"table\" tableValues=\"0.6 0.4\"/><feFuncB type=\"table\" tableValues=\"0.6 0.4\"/></feComponentTransfer>');\n        str = Snap.filter.invert(1);\n        expect(str).to.be('<feComponentTransfer><feFuncR type=\"table\" tableValues=\"1 0\"/><feFuncG type=\"table\" tableValues=\"1 0\"/><feFuncB type=\"table\" tableValues=\"1 0\"/></feComponentTransfer>');\n    });\n    it(\"Snap.filter.saturate\", function() {\n        var str = Snap.filter.saturate(0.3);\n        expect(str).to.be('<feColorMatrix type=\"saturate\" values=\"0.7\"/>');\n        str = Snap.filter.saturate(1);\n        expect(str).to.be('<feColorMatrix type=\"saturate\" values=\"0\"/>');\n    });\n    it(\"Snap.filter.sepia\", function() {\n        var str = Snap.filter.sepia(0.3);\n        expect(str).to.be('<feColorMatrix type=\"matrix\" values=\"0.8179 0.23070000000000002 0.0567 0 0 0.10470000000000002 0.9058 0.050400000000000014 0 0 0.0816 0.1602 0.7393 0 0 0 0 0 1 0\"/>');\n        str = Snap.filter.sepia(1);\n        expect(str).to.be('<feColorMatrix type=\"matrix\" values=\"0.393 0.769 0.189 0 0 0.349 0.686 0.168 0 0 0.272 0.534 0.131 0 0 0 0 0 1 0\"/>');\n    });\n    it(\"Snap.filter.shadow - dx & dy\", function() {\n        var str = Snap.filter.shadow(5, 5);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"4\"/><feOffset dx=\"5\" dy=\"5\" result=\"offsetblur\"/><feFlood flood-color=\"#000000\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"1\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n        str = Snap.filter.shadow(-1, 3);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"4\"/><feOffset dx=\"-1\" dy=\"3\" result=\"offsetblur\"/><feFlood flood-color=\"#000000\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"1\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n    });\n    it(\"Snap.filter.shadow - dx & dy, opacity\", function() {\n        var str = Snap.filter.shadow(5, 5, 5);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"4\"/><feOffset dx=\"5\" dy=\"5\" result=\"offsetblur\"/><feFlood flood-color=\"#000000\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"5\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n        str = Snap.filter.shadow(-1, 3, 10);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"4\"/><feOffset dx=\"-1\" dy=\"3\" result=\"offsetblur\"/><feFlood flood-color=\"#000000\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"10\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n    });\n    it(\"Snap.filter.shadow - dx & dy, color, opacity\", function() {\n        var str = Snap.filter.shadow(5, 5, '#F00', 1);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"4\"/><feOffset dx=\"5\" dy=\"5\" result=\"offsetblur\"/><feFlood flood-color=\"#ff0000\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"1\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n        str = Snap.filter.shadow(-1, 3, 'hsla(128deg, 50%, 50%, 0.8)', .5);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"4\"/><feOffset dx=\"-1\" dy=\"3\" result=\"offsetblur\"/><feFlood flood-color=\"rgba(64,191,81,0.8)\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"0.5\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n    });\n\n    it(\"Snap.filter.shadow - dx & dy, blur, color, opacity\", function() {\n        var str = Snap.filter.shadow(5, 5, 5, '#F00', 1);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"5\"/><feOffset dx=\"5\" dy=\"5\" result=\"offsetblur\"/><feFlood flood-color=\"#ff0000\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"1\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n        str = Snap.filter.shadow(-1, 3, 10, 'hsla(128deg, 50%, 50%, 0.8)', .5);\n        expect(str).to.be('<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"10\"/><feOffset dx=\"-1\" dy=\"3\" result=\"offsetblur\"/><feFlood flood-color=\"rgba(64,191,81,0.8)\"/><feComposite in2=\"offsetblur\" operator=\"in\"/><feComponentTransfer><feFuncA type=\"linear\" slope=\"0.5\"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in=\"SourceGraphic\"/></feMerge>');\n    });\n\n\n});\n"
  },
  {
    "path": "test/gradients.js",
    "content": "describe(\"Gradients\", function () {\n    var s,\n        r;\n    beforeEach(function () {\n        s = Snap(100, 100);\n        r = s.rect(0, 0, 100, 100);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    function getGrad(el) {\n        if (!el) {\n            el = r;\n        }\n        var id = el.node.getAttribute(\"fill\");\n        id = Snap.deurl(id);\n        return s.select(id);\n    }\n\n    it(\"creates simple gradient\", function () {\n        r.attr({fill: \"l(0,0,1,0)#fff-#000\"});\n        var g = getGrad();\n        expect(g).to.not.be(null);\n        expect(g.stops().length).to.be(2);\n        expect(g.stops()[0].attr(\"stop-color\")).to.be(\"rgb(255, 255, 255)\");\n    });\n\n    it(\"creates radial gradient\", function () {\n        r.attr({fill: \"r()#fff-#000\"});\n        var g = getGrad();\n        expect(g).to.not.be(null);\n        expect(g.stops().length).to.be(2);\n        expect(g.stops()[0].attr(\"stop-color\")).to.be(\"rgb(255, 255, 255)\");\n    });\n\n    it(\"returns gradient for .attr(\\\"fill\\\") call\", function () {\n        r.attr({fill: \"l(0,0,1,0)#fff-#fc0:20-#000\"});\n        var g = getGrad(),\n            g2 = r.attr(\"fill\");\n        expect(g).to.be(g2);\n    });\n\n    it(\"creates complex gradient\", function () {\n        r.attr({fill: \"l(0,0,1,0)#fff-#fc0:20-#000\"});\n        var g = getGrad();\n        expect(g).to.not.be(null);\n        expect(g.stops().length).to.be(3);\n        expect(g.stops()[0].attr(\"stop-color\")).to.be(\"rgb(255, 255, 255)\");\n        expect(g.stops()[1].attr(\"offset\")).to.be(\"20%\");\n    });\n\n    it(\"updates simple gradient\", function () {\n        r.attr({fill: \"l(0,0,1,0)#fff-#000\"});\n        var g = getGrad();\n        expect(g).to.not.be(null);\n        expect(g.stops().length).to.be(2);\n        expect(g.stops()[0].attr(\"stop-color\")).to.be(\"rgb(255, 255, 255)\");\n        g.setStops(\"#000-#fff\");\n        expect(g.stops().length).to.be(2);\n        expect(g.stops()[0].attr(\"stop-color\")).to.be(\"rgb(0, 0, 0)\");\n        g.setStops(\"#000-red-#fff\");\n        expect(g.stops().length).to.be(3);\n        expect(g.stops()[1].attr(\"stop-color\")).to.be(\"rgb(255, 0, 0)\");\n    });\n\n    it(\"adds stops to the gradient\", function () {\n        r.attr({fill: \"l(0,0,1,0)#fff-#000\"});\n        var g = getGrad();\n        expect(g).to.not.be(null);\n        expect(g.stops().length).to.be(2);\n        expect(g.stops()[0].attr(\"stop-color\")).to.be(\"rgb(255, 255, 255)\");\n        g.addStop(\"red\", 20);\n        expect(g.stops().length).to.be(3);\n        expect(g.stops()[1].attr(\"stop-color\")).to.be(\"rgb(255, 0, 0)\");\n        expect(g.stops()[1].attr(\"offset\")).to.be(\"20%\");\n    });\n\n});\n"
  },
  {
    "path": "test/matrix.js",
    "content": "describe(\"Matrix methods\", function () {\n    it(\"Matrix.add - matrix\", function() {\n        var matrix1 = new Snap.Matrix(1, 0, 0, 1, 5, 5);\n        var matrix2 = new Snap.Matrix(1, 0, 0, 1, 10, 10);\n        var result = matrix1.add(matrix2);\n        expect(result).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: 15,\n            f: 15\n        });\n        // add two 90 degree rotations\n        var matrix3 = new Snap.Matrix(0, 1, -1, 0, 0, 0);\n        var matrix4 = new Snap.Matrix(0, 1, -1, 0, 0, 0);\n        result = matrix3.add(matrix4);\n        expect(result).to.eql({\n            a: -1,\n            b: 0,\n            c: 0,\n            d: -1,\n            e: 0,\n            f: 0\n        });\n    });\n    it(\"Matrix.add - numbers\", function() {\n        var matrix1 = new Snap.Matrix(1, 0, 0, 1, 5, 5);\n        var result = matrix1.add(1, 0, 0, 1, 10, 10);\n        expect(result).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: 15,\n            f: 15\n        });\n    });\n    it(\"Matrix.clone\", function() {\n        var matrix1 = new Snap.Matrix(1, 2, 3, 4, 5, 6);\n        var clone = matrix1.clone();\n        expect(clone).to.not.be(matrix1);\n        expect(clone).to.eql({\n            a: 1,\n            b: 2,\n            c: 3,\n            d: 4,\n            e: 5,\n            f: 6\n        });\n    });\n    it(\"Matrix.invert\", function() {\n        var matrix1 = new Snap.Matrix(1, 2, 3, 4, 5, 6);\n        var inverse = matrix1.invert();\n        expect(inverse).to.eql({\n            a: -2,\n            b: 1,\n            c: 1.5,\n            d: -0.5,\n            e: 1,\n            f: -2\n        });\n    });\n    it(\"Matrix.rotate\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 0, 0);\n        matrix.rotate(45, 0, 0);\n        expect(+matrix.a.toFixed(3)).to.be(0.707);\n        expect(+matrix.b.toFixed(3)).to.be(0.707);\n        expect(+matrix.c.toFixed(3)).to.be(-0.707);\n        expect(+matrix.d.toFixed(3)).to.be(0.707);\n        expect(+matrix.e.toFixed(3)).to.be(0);\n        expect(+matrix.f.toFixed(3)).to.be(0);\n    });\n    it(\"Matrix.scale - x\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.scale(2);\n        expect(matrix).to.eql({\n            a: 2,\n            b: 0,\n            c: 0,\n            d: 2,\n            e: 20,\n            f: 30\n        });\n        matrix.scale(0.5);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: 20,\n            f: 30\n        });\n    });\n    it(\"Matrix.scale - x, y\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.scale(2, 3);\n        expect(matrix).to.eql({\n            a: 2,\n            b: 0,\n            c: 0,\n            d: 3,\n            e: 20,\n            f: 30\n        });\n        matrix.scale(0.5, 1);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 3,\n            e: 20,\n            f: 30\n        });\n    });\n    it(\"Matrix.scale - x, y, cx, cy\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.scale(2, 3, 5, -5);\n        expect(matrix).to.eql({\n            a: 2,\n            b: 0,\n            c: 0,\n            d: 3,\n            e: 15,\n            f: 40\n        });\n    });\n    it(\"Matrix.split\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 0, 0);\n        var result = matrix.split();\n        expect(result.dx).to.be(0);\n        expect(result.dy).to.be(0);\n        expect(result.scalex).to.be(1);\n        expect(result.scaley).to.be(1);\n        expect(result.shear).to.be(0);\n        expect(result.rotate).to.be(0);\n        expect(result.isSimple).to.be(true);\n        \n        matrix = new Snap.Matrix(1.5, 0, 0, 0.5, 20, 25);\n        result = matrix.split();\n        expect(result.dx).to.be(20);\n        expect(result.dy).to.be(25);\n        expect(result.scalex).to.be(1.5);\n        expect(result.scaley).to.be(0.5);\n        expect(result.shear).to.be(0);\n        expect(result.rotate).to.be(0);\n        expect(result.isSimple).to.be(true);\n    });\n    it(\"Matrix.toTransformString\", function() {\n        var matrix = new Snap.Matrix(1.5, 0, 0, 0.5, 20, 25);\n        var str = matrix.toTransformString();\n        var s = Snap(10, 10);\n        var rect = s.rect(0, 0, 10, 20);\n        rect.transform(str);\n        var transform = rect.transform();\n        expect(transform.localMatrix).to.eql({\n            a: 1.5,\n            b: 0,\n            c: 0,\n            d: 0.5,\n            e: 20,\n            f: 25\n        });\n    });\n    it(\"Matrix.translate\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.translate(10, -10);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: 30,\n            f: 20\n        });\n        matrix.translate(-1, -2);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: 29,\n            f: 18\n        });\n    });\n    it(\"Matrix.skewX\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.skewX(45);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 0,\n            c: 1,\n            d: 1,\n            e: 20,\n            f: 30\n        });\n    });\n    it(\"Matrix.skewY\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.skewY(45);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 1,\n            c: 0,\n            d: 1,\n            e: 20,\n            f: 30\n        });\n    });\n    it(\"Matrix.skew\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        matrix.skew(45, -45);\n        expect(matrix).to.eql({\n            a: 1,\n            b: -1,\n            c: 1,\n            d: 1,\n            e: 20,\n            f: 30\n        });\n    });\n    it(\"Matrix.x\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        var result = matrix.x(10, -10);\n        expect(result).to.be(30);\n    });\n    it(\"Matrix.y\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 20, 30);\n        var result = matrix.y(10, -10);\n        expect(result).to.be(20);\n    });\n       \n});"
  },
  {
    "path": "test/mina.js",
    "content": "describe(\"Mina methods\", function () {\n    var s;\n    beforeEach(function () {\n        s = Snap(100, 100);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    \n    var validateDescriptor = function(obj) {\n        expect(obj).to.be.an('object');\n        expect(obj.id).to.be.a('string');\n        expect(obj.start).to.be.a('number');\n        expect(obj.end).to.be.a('number');\n        expect(obj.b).to.be.a('number');\n        expect(obj.s).to.be.a('number');\n        expect(obj.dur).to.be.a('number');\n        expect(obj.spd).to.be.a('number');\n        \n        expect(obj.get).to.be.a('function');\n        expect(obj.set).to.be.a('function');\n        expect(obj.easing).to.be.a('function');\n        expect(obj.status).to.be.a('function');\n        expect(obj.speed).to.be.a('function');\n        expect(obj.duration).to.be.a('function');\n        expect(obj.stop).to.be.a('function');\n    };\n    \n    it(\"mina\", function() {\n        var n;\n        var animDescriptor = mina(10, 20, 0, 1000, function(newN) {\n            n = newN;\n        }, function() {});\n        \n        validateDescriptor(animDescriptor);\n        expect(animDescriptor.start).to.be(10);\n        expect(animDescriptor.end).to.be(20);\n        expect(animDescriptor.b).to.be(0);\n        expect(animDescriptor.s).to.be(0);\n        expect(animDescriptor.dur).to.be(1000);\n        expect(animDescriptor.easing).to.be(mina.linear);\n    });\n    it(\"mina.getById\", function() {\n        var anim1 = mina(10, 20, 0, 1000, function() {}, function() {});\n        var anim2 = mina(10, 20, 0, 1000, function() {}, function() {});\n        expect(mina.getById(anim1.id)).to.be(anim1);\n        expect(mina.getById(anim2.id)).to.be(anim2);\n    });\n    it(\"mina.time\", function() {\n        var now = (new Date).getTime();\n        expect(mina.time()).to.be(now);\n    });\n    it(\"mina.backin\", function() {\n        expect(mina.backin(0)).to.be(0);\n        expect(mina.backin(1)).to.be(1);\n    });\n    it(\"mina.backout\", function() {\n        expect(mina.backout(0)).to.be(0);\n        expect(mina.backout(1)).to.be(1);\n    });\n    it(\"mina.bounce\", function() {\n        expect(mina.bounce(0)).to.be(0);\n        expect(mina.bounce(1)).to.be(1);\n    });\n    it(\"mina.easein\", function() {\n        expect(mina.easein(0)).to.be(0);\n        expect(mina.easein(1)).to.be(1);\n    });\n    it(\"mina.easeinout\", function() {\n        expect(mina.easeinout(0)).to.be(0);\n        expect(mina.easeinout(1)).to.be(1);\n    });\n    it(\"mina.easeout\", function() {\n        expect(mina.easeout(0)).to.be(0);\n        expect(mina.easeout(1)).to.be(1);\n    });\n    it(\"mina.elastic\", function() {\n        expect(mina.elastic(0)).to.be(0);\n        expect(mina.elastic(1)).to.be(1);\n    });\n    it(\"mina.linear\", function() {\n        expect(mina.linear(0)).to.be(0);\n        expect(mina.linear(0.2)).to.be(0.2);\n        expect(mina.linear(0.7)).to.be(0.7);\n        expect(mina.linear(1)).to.be(1);\n    });\n});"
  },
  {
    "path": "test/paper.js",
    "content": "describe(\"Check for Paper Creation\", function () {\n    it(\"creates simple paper 20 × 10\", function () {\n        var s = Snap(20, 10);\n        var S = s.node;\n        expect(S).to.not.be(null);\n        expect(S.getAttribute(\"width\")).to.be(\"20\");\n        expect(S.getAttribute(\"height\")).to.be(\"10\");\n        s.remove();\n    });\n    it(\"removal of paper\", function () {\n        var s = Snap(20, 10);\n        var S = s.node;\n        expect(S).to.not.be(null);\n        s.remove();\n        S = document.querySelectorAll(\"svg\").length;\n        expect(S).to.be(1);\n    });\n    it(\"creates simple paper 20% × 10em\", function () {\n        var s = Snap(\"20%\", \"10em\");\n        var S = s.node;\n        expect(S).to.not.be(null);\n        expect(S.getAttribute(\"width\")).to.be(\"20%\");\n        expect(S.getAttribute(\"height\")).to.be(\"10em\");\n        s.remove();\n    });\n    it(\"converts existing SVG element to paper\", function () {\n        var S = document.getElementById(\"svgroot\");\n        var s = Snap(S);\n        expect(document.querySelector(\"#svgroot circle\")).to.be(null);\n        var c = s.circle(10, 20, 5);\n        expect(document.querySelectorAll(\"#svgroot circle\").length).to.be(1);\n        c.remove();\n    });\n    it(\"converts existing SVG element to paper (as query)\", function () {\n        var S = document.getElementById(\"svgroot\");\n        var s = Snap(\"#svgroot\");\n        expect(document.querySelector(\"#svgroot circle\")).to.be(null);\n        var c = s.circle(10, 20, 5);\n        expect(document.querySelectorAll(\"#svgroot circle\").length).to.be(1);\n        c.remove();\n    });\n});\n\ndescribe(\"Paper methods\", function () {\n    /*\n        Paper.el\n        Paper.filter\n        Paper.gradient\n        Paper.image\n        Paper.toString\n    */\n    var paper;\n    beforeEach(function () {\n        paper = Snap(100, 100);\n    });\n    afterEach(function () {\n        paper.remove();\n    });\n\n    it(\"Paper.svg\", function() {\n        var c = paper.svg();\n        expect(c.node.nodeName).to.be(\"svg\");\n        expect(c.node.parentNode).to.be(paper.node);\n    });\n    it(\"Paper.svg(x, y)\", function() {\n        var c = paper.svg(100, 200);\n        expect(c.node.nodeName).to.be(\"svg\");\n        expect(c.node.x.baseVal.value).to.be(100);\n        expect(c.node.y.baseVal.value).to.be(200);\n        expect(c.node.parentNode).to.be(paper.node);\n    });\n    it(\"Paper.svg(x, y, w, h, viewbox)\", function() {\n        var c = paper.svg(100, 200, 300, 400, 10, 20, 30, 40);\n        expect(c.node.nodeName).to.be(\"svg\");\n        expect(c.node.x.baseVal.value).to.be(100);\n        expect(c.node.y.baseVal.value).to.be(200);\n        expect(c.node.width.baseVal.value).to.be(300);\n        expect(c.node.height.baseVal.value).to.be(400);\n        expect(c.node.getAttribute(\"viewBox\")).to.be(\"10 20 30 40\");\n        expect(c.node.parentNode).to.be(paper.node);\n    });\n    it(\"Paper.el\", function() {\n        var c = paper.el(\"circle\");\n        expect(c.node.nodeName).to.be(\"circle\");\n        expect(c.node.parentNode).to.be(paper.node);\n    });\n    it(\"Paper.filter\", function() {\n        var filter = paper.filter('<feGaussianBlur stdDeviation=\"2\"/>');\n        expect(filter.node.nodeName).to.be('filter');\n        var child = filter.node.firstChild;\n        expect(child).to.be.ok();\n        expect(child.nodeName).to.be('feGaussianBlur');\n        expect(child.getAttribute(\"stdDeviation\")).to.be('2');\n    });\n    it(\"Paper.gradient - linear\", function() {\n        var gradient = paper.gradient(\"l(0, 0, 1, 1)#000-#f00-#fff\");\n        expect(gradient.node.nodeName).to.be('linearGradient');\n        expect(gradient.node.getAttribute('x1')).to.be(\"0\");\n        expect(gradient.node.getAttribute('y1')).to.be(\"0\");\n        expect(gradient.node.getAttribute('x2')).to.be(\"1\");\n        expect(gradient.node.getAttribute('y2')).to.be(\"1\");\n        var stops = gradient.node.querySelectorAll(\"stop\");\n        expect(stops.length).to.be(3);\n    });\n    it(\"Paper.gradient - radial\", function() {\n        var gradient = paper.gradient(\"r(0.3, 0.4, 0.5)#000-#fff\");\n        expect(gradient.node.nodeName).to.be('radialGradient');\n        expect(gradient.node.getAttribute('cx')).to.be(\"0.3\");\n        expect(gradient.node.getAttribute('cy')).to.be(\"0.4\");\n        expect(gradient.node.getAttribute('r')).to.be(\"0.5\");\n        var stops = gradient.node.querySelectorAll(\"stop\");\n        expect(stops.length).to.be(2);\n    });\n    it(\"Paper.image\", function() {\n        var image = paper.image('#', 10, 20, 30, 40);\n        var img = document.querySelector(\"image\");\n        expect(img).to.not.be(null);\n        expect(img.getAttribute(\"x\")).to.be(\"10\");\n        expect(img.getAttribute(\"y\")).to.be(\"20\");\n        expect(img.getAttribute(\"width\")).to.be(\"30\");\n        expect(img.getAttribute(\"height\")).to.be(\"40\");\n    });\n    it(\"Paper.toString\", function() {\n        paper.circle(10, 20, 30);\n        var str = paper.toString();\n        expect(str).to.match(/.*?<svg.*?>.*?<circle.*?<\\/svg>/);\n    });\n    it(\"Paper.getBBox\", function() {\n        paper.circle(50, 50, 30);\n        var bb = paper.getBBox();\n        expect(bb.x).to.be(20);\n        expect(bb.y).to.be(20);\n        expect(bb.width).to.be(60);\n        expect(bb.height).to.be(60);\n    });\n});"
  },
  {
    "path": "test/path.js",
    "content": "describe(\"Path methods\", function () {\n    it(\"Snap.path.getTotalLength\", function () {\n        expect(+Snap.path.getTotalLength(\"M0,0 100,0\").toFixed(2)).to.be(100);\n    });\n    it(\"Snap.path.getPointAtLength\", function () {\n        expect(Snap.path.getPointAtLength(\"M0,0 100,0\", 50)).to.eql({\n            x: 50,\n            y: 0,\n            m: {\n                x: 25,\n                y: 0\n            },\n            n: {\n                x: 75,\n                y: 0\n            },\n            start: {\n                x: 0,\n                y: 0\n            },\n            end: {\n                x: 100,\n                y: 0\n            },\n            alpha: 180\n        });\n    });\n    it(\"Snap.path.getSubpath\", function () {\n        expect(Snap.path.getSubpath(\"M0,0 100,0\", 10, 90)).to.be(\"M9.995,0C29.153,0,70.839,0,90,0\");\n        expect(Snap.path.getSubpath(\"M0,0 100,0\", 0, 90)).to.be(\"M0,0C0,0,64.674,0,90,0\");\n        expect(Snap.path.getSubpath(\"M0,0 100,0\", 10, 120)).to.be(\"M10,0C35.326,0,100,0,100,0\");\n    });\n    it(\"Snap.path.findDotsAtSegment\", function () {\n        expect(Snap.path.findDotsAtSegment(0,0,0,0,100,0,100,0,.5)).to.eql({\n            x: 50,\n            y: 0,\n            m: {\n                x: 25,\n                y: 0\n            },\n            n: {\n                x: 75,\n                y: 0\n            },\n            start: {\n                x: 0,\n                y: 0\n            },\n            end: {\n                x: 100,\n                y: 0\n            },\n            alpha: 180\n        });\n    });\n    it(\"Snap.path.bezierBBox - params\", function () {\n        var bbox = Snap.path.bezierBBox(10, 10, 10, 20, 110, 0, 110, 10);\n        expect(bbox.cx).to.be(60);\n        expect(bbox.cy).to.be(10);\n        expect(bbox.x).to.be(10);\n        expect(bbox.w).to.be(100);\n        expect(bbox.width).to.be(100);\n        expect(bbox.x2).to.be(110);\n    });\n    it(\"Snap.path.bezierBBox - array\", function () {\n        var bbox = Snap.path.bezierBBox([10, 10, 10, 20, 110, 0, 110, 10]);\n        expect(bbox.cx).to.be(60);\n        expect(bbox.cy).to.be(10);\n        expect(bbox.x).to.be(10);\n        expect(bbox.w).to.be(100);\n        expect(bbox.width).to.be(100);\n        expect(bbox.x2).to.be(110);\n    });\n    it(\"Snap.path.getBBox\", function() {\n        // same as 10,20,30,40 rect\n        var bbox = Snap.path.getBBox(\"M10,20h30v40h-30z\");\n        expect(bbox.x).to.eql(10);\n        expect(bbox.y).to.eql(20);\n        expect(bbox.width).to.eql(30);\n        expect(bbox.height).to.eql(40);\n        expect(bbox.x2).to.eql(10 + 30);\n        expect(bbox.y2).to.eql(20 + 40);\n    });\n    it(\"Snap.path.isPointInsideBBox\", function () {\n        expect(Snap.path.isPointInsideBBox({x: 0, y: 0, width: 10, height: 10}, 5, 5)).to.be(true);\n        expect(Snap.path.isPointInsideBBox({x: 0, y: 0, width: 10, height: 10}, 10, 5)).to.be(true);\n        expect(Snap.path.isPointInsideBBox({x: 0, y: 0, width: 10, height: 10}, 10, 10)).to.be(true);\n    });\n    it(\"Snap.path.isBBoxIntersect\", function () {\n        expect(Snap.path.isBBoxIntersect({\n                x: 0,\n                y: 0,\n                width: 10,\n                height: 10\n            }, {\n                x: 5,\n                y: 5,\n                width: 15,\n                height: 15\n            })).to.be(true);\n        expect(Snap.path.isBBoxIntersect({\n                x: 0,\n                y: 0,\n                width: 10,\n                height: 10\n            }, {\n                x: 5,\n                y: 5,\n                width: 7,\n                height: 7\n            })).to.be(true);\n        expect(Snap.path.isBBoxIntersect({\n                x: 0,\n                y: 0,\n                width: 10,\n                height: 10\n            }, {\n                x: 15,\n                y: 15,\n                width: 10,\n                height: 10\n            })).to.be(false);\n    });\n    it(\"Snap.path.toAbsolute\", function() {\n        var relPath = \"M 10 10\" +\n                        \"h 40\" +\n                        \"v 30\" +\n                        \"h -40\" +\n                        \"l 0 -30\" +\n                        \"m 0 40\" +\n                        \"l 30 0\" +\n                        \"l 0 40\" +\n                        \"l -30 0\" +\n                        \"m 0 10\" +\n                        \"c 20 20 40 20 40 0\" +\n                        \"m -40 40\" +\n                        \"c 10 -25 20 -25 30 0\" +\n                        \"s 10 25 20 0\" +\n                        \"m 20 -130\" +\n                        \"q 30 30 60 0\" +\n                        \"m -60 40\" +\n                        \"q 10 20 20 0\" +\n                        \"t 20 0\" +\n                        \"m -40 30\" +\n                        \"a 10 10 0 0 0 40 0\";\n        var absPath = Snap.path.toAbsolute(relPath);\n        var i = 0;\n        var checkNext = function(arr) {\n            expect(absPath[i++]).to.eql(arr);\n        }\n        checkNext(['M', 10, 10]);\n        checkNext(['H', 50]);\n        checkNext(['V', 40]);\n        checkNext(['H', 10]);\n        checkNext(['L', 10, 10]);\n        checkNext(['M', 10, 50]);\n        checkNext(['L', 40, 50]);\n        checkNext(['L', 40, 90]);\n        checkNext(['L', 10, 90]);\n        checkNext(['M', 10, 100]);\n        checkNext(['C', 30, 120, 50, 120, 50, 100]);\n        checkNext(['M', 10, 140]);\n        checkNext(['C', 20, 115, 30, 115, 40, 140]);\n        checkNext(['S', 50, 165, 60, 140]);\n        checkNext(['M', 80, 10]);\n        checkNext(['Q', 110, 40, 140, 10]);\n        checkNext(['M', 80, 50]);\n        checkNext(['Q', 90, 70, 100, 50]);\n        checkNext(['T', 120, 50]);\n        checkNext(['M', 80, 80]);\n        checkNext(['A', 10, 10, 0, 0, 0, 120, 80]);\n    });\n    it(\"Snap.path.toRelative\", function() {\n        var absPath = \"M10 10 H 50 V 40 H 10 L 10 10\" +\n                    \"M10 50 L 40 50 L 40 90 L 10 90\" +\n                    \"M10 100 C 30 120, 50 120, 50 100\" +\n                    \"M10 140 C 20 115, 30, 115, 40 140 S 50 165, 60 140\" +\n                    \"M80 10 Q 110 40, 140 10\" +\n                    \"M80 50 Q 90 70, 100 50 T 120 50\" +\n                    \"M80 80 A 10 10 0 0 0 120 80\";\n        var relPath = Snap.path.toRelative(absPath);\n        var i = 0;\n        var checkNext = function(arr) {\n            expect(relPath[i++]).to.eql(arr);\n        }\n        \n        checkNext(['M', 10, 10]);\n        checkNext(['h', 40]);\n        checkNext(['v', 30]);\n        checkNext(['h', -40]);\n        checkNext(['l', 0, -30]);\n        checkNext(['m', 0, 40]);\n        checkNext(['l', 30, 0]);\n        checkNext(['l', 0, 40]);\n        checkNext(['l', -30, 0]);\n        checkNext(['m', 0, 10]);\n        checkNext(['c', 20, 20, 40, 20, 40, 0]);\n        checkNext(['m', -40, 40]);\n        checkNext(['c', 10, -25, 20, -25, 30, 0]);\n        checkNext(['s', 10, 25, 20, 0]);\n        checkNext(['m', 20, -130]);\n        checkNext(['q', 30, 30, 60, 0]);\n        checkNext(['m', -60, 40]);\n        checkNext(['q', 10, 20, 20, 0]);\n        checkNext(['t', 20, 0]);\n        checkNext(['m', -40, 30]);\n        checkNext(['a', 10, 10, 0, 0, 0, 40, 0]);\n    });\n    it(\"Snap.path.toCubic\", function() {\n        var absPath = \"M10 10 H 50 V 40 H 10 L 10 10\" +\n                    \"M10 50 L 40 50 L 40 90 L 10 90\" +\n                    \"M10 100 C 30 120, 50 120, 50 100\" +\n                    \"M10 140 C 20 115, 30, 115, 40 140 S 50 165, 60 140\" +\n                    \"M80 10 Q 110 40, 140 10\" +\n                    \"M80 50 Q 90 70, 100 50 T 120 50\" +\n                    \"M80 80 A 10 10 0 0 0 120 80\";\n        var relPath = \"M 10 10\" +\n                        \"h 40\" +\n                        \"v 30\" +\n                        \"h -40\" +\n                        \"l 0 -30\" +\n                        \"m 0 40\" +\n                        \"l 30 0\" +\n                        \"l 0 40\" +\n                        \"l -30 0\" +\n                        \"m 0 10\" +\n                        \"c 20 20 40 20 40 0\" +\n                        \"m -40 40\" +\n                        \"c 10 -25 20 -25 30 0\" +\n                        \"s 10 25 20 0\" +\n                        \"m 20 -130\" +\n                        \"q 30 30 60 0\" +\n                        \"m -60 40\" +\n                        \"q 10 20 20 0\" +\n                        \"t 20 0\" +\n                        \"m -40 30\" +\n                        \"a 10 10 0 0 0 40 0\";\n        var cubicPathFromAbs = Snap.path.toCubic(absPath);\n        var cubicPathFromRel = Snap.path.toCubic(relPath);\n        var i = 0;\n        var checkNext = function(arr) {\n            expect(cubicPathFromAbs[i]).to.eql(arr);\n            expect(cubicPathFromRel[i]).to.eql(arr);\n            i++;\n        }       \n        \n        checkNext(['M', 10, 10]);\n        checkNext(['C', 10, 10, 50, 10, 50, 10]);\n        checkNext(['C', 50, 10, 50, 40, 50, 40]);\n        checkNext(['C', 50, 40, 10, 40, 10, 40]);\n        checkNext(['C', 10, 40, 10, 10, 10, 10]);\n        checkNext(['M', 10, 50]);\n        checkNext(['C', 10, 50, 40, 50, 40, 50]);\n        checkNext(['C', 40, 50, 40, 90, 40, 90]);\n        checkNext(['C', 40, 90, 10, 90, 10, 90]);\n        checkNext(['M', 10, 100]);\n        checkNext(['C', 30, 120, 50, 120, 50, 100]);\n        checkNext(['M', 10, 140]);\n        checkNext(['C', 20, 115, 30, 115, 40, 140]);\n        checkNext(['C', 50, 165, 50, 165, 60, 140]);\n        checkNext(['M', 80, 10]);\n        checkNext(['C', 100, 29.999999999999996, 120, 29.999999999999996, 140, 10]);\n        checkNext(['M', 80, 50]);\n        checkNext(['C', 86.66666666666666, 63.33333333333333, 93.33333333333333, 63.33333333333333, 100, 50]);\n        checkNext(['C', 106.66666666666666, 36.666666666666664, 113.33333333333333, 36.666666666666664, 120, 50]);\n        checkNext(['M', 80, 80]);\n        checkNext(['C', 80, 95.39600717839002, 96.66666666666667, 105.01851166488379, 110, 97.32050807568878]);\n        checkNext(['C', 116.18802153517007, 93.74785217660714, 120, 87.14531179816328, 120, 80]);\n        \n    });\n    it(\"Snap.path.map\", function() {\n        var absPath = \"M10 10 H 50 V 40 H 10 L 10 10\" +\n                    \"M10 50 L 40 50 L 40 90 L 10 90\" +\n                    \"M10 100 C 30 120, 50 120, 50 100\" +\n                    \"M10 140 C 20 115, 30, 115, 40 140 S 50 165, 60 140\" +\n                    \"M80 10 Q 110 40, 140 10\" +\n                    \"M80 50 Q 90 70, 100 50 T 120 50\" +\n                    \"M80 80 A 10 10 0 0 0 120 80\";\n        var matrix = new Snap.Matrix(1, 0, 0, 1, 1000, 0);\n        var transformedPath = Snap.path.map(absPath, matrix);\n        \n        var i = 0;\n        var checkNext = function(arr) {\n            expect(transformedPath[i++]).to.eql(arr);\n        }\n        checkNext(['M', 1010, 10]);\n        checkNext(['C', 1010, 10, 1050, 10, 1050, 10]);\n        checkNext(['C', 1050, 10, 1050, 40, 1050, 40]);\n        checkNext(['C', 1050, 40, 1010, 40, 1010, 40]);\n        checkNext(['C', 1010, 40, 1010, 10, 1010, 10]);\n        checkNext(['M', 1010, 50]);\n        checkNext(['C', 1010, 50, 1040, 50, 1040, 50]);\n        checkNext(['C', 1040, 50, 1040, 90, 1040, 90]);\n        checkNext(['C', 1040, 90, 1010, 90, 1010, 90]);\n        checkNext(['M', 1010, 100]);\n        checkNext(['C', 1030, 120, 1050, 120, 1050, 100]);\n        checkNext(['M', 1010, 140]);\n        checkNext(['C', 1020, 115, 1030, 115, 1040, 140]);\n        checkNext(['C', 1050, 165, 1050, 165, 1060, 140]);\n        checkNext(['M', 1080, 10]);\n        checkNext(['C', 1100, 29.999999999999996, 1120, 29.999999999999996, 1140, 10]);\n        checkNext(['M', 1080, 50]);\n        checkNext(['C', 1086.66666666666666, 63.33333333333333, 1093.33333333333333, 63.33333333333333, 1100, 50]);\n        checkNext(['C', 1106.66666666666666, 36.666666666666664, 1113.33333333333333, 36.666666666666664, 1120, 50]);\n        checkNext(['M', 1080, 80]);\n        checkNext(['C', 1080, 95.39600717839002, 1096.66666666666667, 105.01851166488379, 1110, 97.32050807568878]);\n        checkNext(['C', 1116.18802153517007, 93.74785217660714, 1120, 87.14531179816328, 1120, 80]);\n    });\n    it(\"Snap.path.isPointInside\", function () {\n        var path = \"M10 10 H 50 V 40 H 10 L 10 10 Z\" +\n            \"M10 50 L 40 50 L 40 90 L 10 90 Z\" +\n            \"M10 100 C 30 120, 50 120, 50 100 Z\" +\n            \"M10 140 C 20 115, 30, 115, 40 140 S 50 165, 60 140 Z\" +\n            \"M80 10 Q 110 40, 140 10 Z\" +\n            \"M80 50 Q 90 70, 100 50 T 120 50 Z\" +\n            \"M80 80 A 10 10 0 0 0 120 80 Z\";\n\n        expect(Snap.path.isPointInside(path, 15, 35)).to.be(true);\n        expect(Snap.path.isPointInside(path, 35, 75)).to.be(true);\n        expect(Snap.path.isPointInside(path, 15, 102)).to.be(true);\n        expect(Snap.path.isPointInside(path, 15, 135)).to.be(true);\n        expect(Snap.path.isPointInside(path, 50, 145)).to.be(true);\n        expect(Snap.path.isPointInside(path, 130, 15)).to.be(true);\n        expect(Snap.path.isPointInside(path, 110, 45)).to.be(true);\n        expect(Snap.path.isPointInside(path, 85, 55)).to.be(true);\n        expect(Snap.path.isPointInside(path, 115, 82)).to.be(true);\n        expect(Snap.path.isPointInside(path, 95, 98)).to.be(true);\n        \n        expect(Snap.path.isPointInside(path, 5, 5)).to.be(false);\n        expect(Snap.path.isPointInside(path, 25, 48)).to.be(false);\n        expect(Snap.path.isPointInside(path, 42, 87)).to.be(false);\n        expect(Snap.path.isPointInside(path, 12, 105)).to.be(false);\n        expect(Snap.path.isPointInside(path, 47, 113)).to.be(false);\n        expect(Snap.path.isPointInside(path, 47, 135)).to.be(false);\n        expect(Snap.path.isPointInside(path, 25, 142)).to.be(false);\n        expect(Snap.path.isPointInside(path, 15, 125)).to.be(false);\n        expect(Snap.path.isPointInside(path, 43, 152)).to.be(false);\n        expect(Snap.path.isPointInside(path, 58, 152)).to.be(false);\n        expect(Snap.path.isPointInside(path, 90, 21)).to.be(false);\n        expect(Snap.path.isPointInside(path, 130, 21)).to.be(false);\n        expect(Snap.path.isPointInside(path, 95, 48)).to.be(false);\n        expect(Snap.path.isPointInside(path, 110, 55)).to.be(false);\n        expect(Snap.path.isPointInside(path, 100, 70)).to.be(false);\n        expect(Snap.path.isPointInside(path, 115, 96)).to.be(false);\n        expect(Snap.path.isPointInside(path, 85, 96)).to.be(false);\n\n        // bug #248\n        expect(Snap.path.isPointInside(\"M1.4315332974182866,4.405806462382467 L57.26133189673147,176.23225849529868 A185.30156250000002,185.30156250000002 0 0 1 -172.2890356108522,-68.21405480708441 L-4.307225890271305,-1.7053513701771101 A4.6325390625,4.6325390625 0 0 0 1.4315332974182866,4.405806462382467 Z\", -58.296875, 70.96875)).to.be(true);\n    });\n    \n    it(\"Snap.path.intersection\", function () {\n        var path1 = \"M10 10 H 50 V 40 H 10 L 10 10 Z\" +\n            \"M10 50 L 40 50 L 40 90 L 10 90 Z\" +\n            \"M10 100 C 30 120, 50 120, 50 100 Z\" +\n            \"M10 140 C 20 115, 30, 115, 40 140 S 50 165, 60 140 Z\" +\n            \"M80 10 Q 110 40, 140 10 Z\" +\n            \"M80 50 Q 90 70, 100 50 T 120 50 Z\" +\n            \"M80 80 A 10 10 0 0 0 120 80 Z\";\n        var path2 = \"M10,0 L80,200 L20, 200 L30, 0 L110, 15 L90, 150\";\n        var intersection = Snap.path.intersection(path1, path2);\n        expect(intersection.length).to.be(22);\n        var first = intersection[0];\n        expect(first.x).to.be.a('number');\n        expect(first.y).to.be.a('number');\n        expect(first.t1).to.be.a('number');\n        expect(first.t2).to.be.a('number');\n        expect(first.segment1).to.be.a('number');\n        expect(first.segment2).to.be.a('number');\n        expect(first.bez1).to.be.an('array');\n        expect(first.bez2).to.be.an('array');\n        \n        var checkXY = function(index, x, y) {\n            expect(+intersection[index].x.toFixed(2)).to.be(x);\n            expect(+intersection[index].y.toFixed(2)).to.be(y);\n        }\n        \n        checkXY(0, 13.5, 10);\n        checkXY(1, 29.5, 10);\n        checkXY(2, 24, 40);\n        checkXY(3, 28, 40);\n        checkXY(4, 27.5, 50);\n        checkXY(5, 27.5, 50);\n        checkXY(6, 40, 85.71);\n        checkXY(7, 25.5, 90);\n        checkXY(8, 48.06, 108.75);\n        checkXY(9, 24.46, 110.77);\n        checkXY(10, 45, 100);\n        checkXY(11, 25, 100);\n        checkXY(12, 23.91, 121.7);\n        checkXY(13, 59.46, 141.31);\n        checkXY(14, 59, 140);\n        checkXY(15, 23, 140);\n        checkXY(16, 108.55, 24.82);\n        checkXY(17, 83.33, 10);\n        checkXY(18, 106, 42);\n        checkXY(19, 104.81, 50);\n        checkXY(20, 97.49, 99.44);\n        checkXY(21, 100.37, 80);\n    });\n});\n"
  },
  {
    "path": "test/primitives.js",
    "content": "describe(\"Primitives creation\", function () {\n    var s;\n    beforeEach(function () {\n        s = Snap(100, 100);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    it(\"creates a circle\", function () {\n        var c = s.circle(10, 20, 30);\n        var C = document.querySelector(\"circle\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"cx\")).to.be(\"10\");\n        expect(C.getAttribute(\"cy\")).to.be(\"20\");\n        expect(C.getAttribute(\"r\")).to.be(\"30\");\n    });\n    it(\"creates a rect\", function () {\n        var c = s.rect(10, 20, 30, 40, 5);\n        var C = document.querySelector(\"rect\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"x\")).to.be(\"10\");\n        expect(C.getAttribute(\"y\")).to.be(\"20\");\n        expect(C.getAttribute(\"width\")).to.be(\"30\");\n        expect(C.getAttribute(\"height\")).to.be(\"40\");\n        expect(C.getAttribute(\"rx\")).to.be(\"5\");\n        expect(C.getAttribute(\"ry\")).to.be(\"5\");\n    });\n    it(\"creates a rect with different rx & ry\", function () {\n        var c = s.rect(10, 20, 30, 40, 5, 6);\n        var C = document.querySelector(\"rect\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"x\")).to.be(\"10\");\n        expect(C.getAttribute(\"y\")).to.be(\"20\");\n        expect(C.getAttribute(\"width\")).to.be(\"30\");\n        expect(C.getAttribute(\"height\")).to.be(\"40\");\n        expect(C.getAttribute(\"rx\")).to.be(\"5\");\n        expect(C.getAttribute(\"ry\")).to.be(\"6\");\n    });\n    it(\"creates a ellipse\", function () {\n        var c = s.ellipse(10, 20, 30, 40);\n        var C = document.querySelector(\"ellipse\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"cx\")).to.be(\"10\");\n        expect(C.getAttribute(\"cy\")).to.be(\"20\");\n        expect(C.getAttribute(\"rx\")).to.be(\"30\");\n        expect(C.getAttribute(\"ry\")).to.be(\"40\");\n    });\n    it(\"creates a ellipse\", function () {\n        var c = s.ellipse(10, 20, 30, 40);\n        var C = document.querySelector(\"ellipse\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"cx\")).to.be(\"10\");\n        expect(C.getAttribute(\"cy\")).to.be(\"20\");\n        expect(C.getAttribute(\"rx\")).to.be(\"30\");\n        expect(C.getAttribute(\"ry\")).to.be(\"40\");\n    });\n    it(\"creates a path\", function () {\n        var c = s.path(\"M10,10,50,60\");\n        var C = document.querySelector(\"path\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"d\")).to.be(\"M10,10,50,60\");\n        expect(C.getBBox().width).to.be(40);\n    });\n    it(\"creates a line\", function () {\n        var c = s.line(10, 10, 50, 60);\n        var C = document.querySelector(\"line\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"x1\")).to.be(\"10\");\n        expect(C.getBBox().width).to.be(40);\n    });\n    it(\"creates a polyline\", function () {\n        var c = s.polyline(10, 10, 50, 60, 70, 80);\n        var C = document.querySelector(\"polyline\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"points\")).to.be(\"10,10,50,60,70,80\");\n    });\n    it(\"creates a polygon\", function () {\n        var c = s.polygon(10, 10, 50, 60, 70, 80);\n        var C = document.querySelector(\"polygon\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"points\")).to.be(\"10,10,50,60,70,80\");\n    });\n    it(\"creates a group\", function () {\n        var c = s.group();\n        var C = document.querySelector(\"g\");\n        expect(C).to.not.be(null);\n    });\n    it(\"creates and fills a group\", function () {\n        var c = s.group(),\n            a = s.circle(10, 10, 10),\n            b = s.circle(20, 20, 10),\n            C = document.querySelector(\"g\");\n        c.add(a, b);\n        expect(C).to.not.be(null);\n        expect(C.childNodes.length).to.be(2);\n    });\n    it(\"creates and fills a group on creation\", function () {\n        var circle1 = s.circle(10, 10, 10);\n        var circle2 = s.circle(20, 10, 10);\n        var group = s.g(circle1, circle2);\n        var groupEl = document.querySelector(\"g\");\n        expect(groupEl).to.not.be(null);\n        expect(groupEl.childNodes.length).to.be(2);\n    });\n    it(\"creates a text\", function () {\n        var c = s.text(10, 10, \"test\");\n        var C = document.querySelector(\"text\");\n        expect(C).to.not.be(null);\n        expect(C.getAttribute(\"x\")).to.be(\"10\");\n        expect(C.textContent).to.be(\"test\");\n    });\n    it(\"creates a mask\", function () {\n        var c = s.mask();\n        var C = document.querySelector(\"mask\");\n        expect(C).to.not.be(null);\n        expect(C).to.be(c.node);\n    });\n    it(\"creates a pattern\", function () {\n        var c = s.ptrn();\n        var C = document.querySelector(\"pattern\");\n        expect(C).to.not.be(null);\n        expect(C).to.be(c.node);\n    });\n    it(\"creates a pattern(x, y)\", function() {\n        var c = s.ptrn(100, 200);\n        expect(c.node.nodeName).to.be(\"pattern\");\n        expect(c.node.x.baseVal.value).to.be(100);\n        expect(c.node.y.baseVal.value).to.be(200);\n        expect(c.node.parentNode).to.be(s.node);\n    });\n    it(\"creates a pattern(x, y, w, h, viewbox)\", function() {\n        var c = s.ptrn(100, 200, 300, 400, 10, 20, 30, 40);\n        expect(c.node.nodeName).to.be(\"pattern\");\n        expect(c.node.x.baseVal.value).to.be(100);\n        expect(c.node.y.baseVal.value).to.be(200);\n        expect(c.node.width.baseVal.value).to.be(300);\n        expect(c.node.height.baseVal.value).to.be(400);\n        expect(c.node.getAttribute(\"viewBox\")).to.be(\"10 20 30 40\");\n        expect(c.node.parentNode).to.be(s.node);\n    });\n});\n"
  },
  {
    "path": "test/res/file-for-ajax.txt",
    "content": "success"
  },
  {
    "path": "test/set.js",
    "content": "describe(\"Set methods\", function () {\n    var s;\n    beforeEach(function () {\n        s = Snap(100, 100);\n    });\n    afterEach(function () {\n        s.remove();\n    });\n    it(\"Set.animate\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var square = s.rect(60, 60, 30, 30);\n        var set = Snap.set(circle, square);\n        var result = set.animate({opacity: .5}, 10);\n        setTimeout(function() {\n            result.forEach(function (el) {\n              var o = el.attr(\"opacity\");\n              expect(o).to.be(\"0.5\");\n            });\n            done();\n        }, 50);\n        expect(result).to.be(set);\n    });    \n    it(\"Set.animate - with callback\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var square = s.rect(60, 60, 30, 30);\n        var set = Snap.set(circle, square);\n        var result = set.animate({opacity: .5}, 10, function() {\n            result.forEach(function (el) {\n              var o = el.attr(\"opacity\");\n              expect(o).to.be(\"0.5\");\n            });\n            done();\n        });\n        expect(result).to.be(set);\n    });\n    it(\"Set.animate - with easing\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var square = s.rect(60, 60, 30, 30);\n        var set = Snap.set(circle, square);\n        var result = set.animate({opacity: .5}, 10, mina.easein);\n        setTimeout(function() {\n            result.forEach(function (el) {\n              var o = el.attr(\"opacity\");\n              expect(o).to.be(\"0.5\");\n            });\n            done();\n        }, 50);\n        expect(result).to.be(set);\n    });\n    it(\"Set.animate - with callback & easing\", function(done) {\n        var circle = s.circle(10, 20, 30);\n        var square = s.rect(60, 60, 30, 30);\n        var set = Snap.set(circle, square);\n        var result = set.animate({opacity: .5}, 10, mina.easeout, function() {\n            result.forEach(function (el) {\n              var o = el.attr(\"opacity\");\n              expect(o).to.be(\"0.5\");\n            });\n            done();\n        });\n        expect(result).to.be(set);\n    });\n    it(\"Set.clear\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2);\n        expect(set.length).to.be(2);\n        set.clear();\n        expect(set.length).to.be(0);\n    });\n    it(\"Set.exclude\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2, rect3);\n        expect(set.length).to.be(3);\n        var excluded = set.exclude(rect2);\n        expect(set.length).to.be(2);\n        expect(excluded).to.be(true);\n        excluded = set.exclude(rect2);\n        expect(set.length).to.be(2);\n        expect(excluded).to.be(false);\n    });\n    it(\"Set.remove\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2, rect3);\n        expect(set.length).to.be(3);\n        set.remove();\n        expect(set.length).to.be(0);\n        expect(rect1.removed).to.be(true);\n        expect(rect2.removed).to.be(true);\n        expect(rect3.removed).to.be(true);\n    });\n    it(\"Set.forEach\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2, rect3);\n        var i = 0;\n        var arr = [rect1, rect2, rect3];\n        var result = set.forEach(function(item) {\n            expect(arr[i]).to.be(item);\n            expect(this.isContext).to.be(true);\n            i++;\n        }, {isContext: true});\n        expect(result).to.be(set);\n        expect(i).to.be(3);\n    });\n    it(\"Set.pop\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2, rect3);\n        expect(set.length).to.be(3);\n        var result = set.pop();\n        expect(set.length).to.be(2);\n        expect(result).to.be(rect3);\n        expect(set[0]).to.be(rect1);\n        expect(set[1]).to.be(rect2);\n        result = set.pop();\n        expect(set.length).to.be(1);\n        expect(result).to.be(rect2);\n        expect(set[0]).to.be(rect1);\n    });\n    it(\"Set.push\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2);\n        expect(set.length).to.be(2);\n        set.push(rect3);\n        expect(set.length).to.be(3);\n        expect(set[0]).to.be(rect1);\n        expect(set[1]).to.be(rect2);\n        expect(set[2]).to.be(rect3);\n    });\n    it(\"Set.attr\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2);\n        set.attr({\"fill\": \"#ff0000\"});\n        expect(rect1.node.getAttribute(\"fill\")).to.be(\"#ff0000\");\n        expect(rect2.node.getAttribute(\"fill\")).to.be(\"#ff0000\");\n        set.attr({\"stroke\": \"#0000ff\"});\n        expect(rect1.node.getAttribute(\"stroke\")).to.be(\"#0000ff\");\n        expect(rect2.node.getAttribute(\"stroke\")).to.be(\"#0000ff\");\n    });\n    it(\"Set.bind\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2);\n\n        // Setting \"stroke\" on set only applies it to rect1\n        set.bind(\"stroke\", rect1);\n        // Setting \"fill1\" on set maps to fill attribute on rect1\n        set.bind(\"fill1\", rect1, \"fill\");\n        // Setting \"fill2\" on set maps to fill attribute on rect2\n        set.bind(\"fill2\", function(v) { rect2.attr({\"fill\": v}); });\n\n        // Set everything to black\n        rect1.attr({\"fill\": \"#000000\", \"stroke\": \"#000000\"});\n        rect2.attr({\"fill\": \"#000000\", \"stroke\": \"#000000\"});\n\n        set.attr({\"fill1\": \"#00ff00\"});\n        expect(rect1.node.getAttribute(\"fill\")).to.be(\"#00ff00\");\n        expect(rect2.node.getAttribute(\"fill\")).to.be(\"#000000\");\n\n        // Will trigger the fallback implementation of attr which is\n        // to set that attribute on all elements in the set.\n        set.attr({\"fill\": \"#ff0000\"});\n        expect(rect1.node.getAttribute(\"fill\")).to.be(\"#ff0000\");\n        expect(rect2.node.getAttribute(\"fill\")).to.be(\"#ff0000\");\n\n        set.attr({\"fill2\": \"#00ff00\"});\n        expect(rect1.node.getAttribute(\"fill\")).to.be(\"#ff0000\");\n        expect(rect2.node.getAttribute(\"fill\")).to.be(\"#00ff00\");\n\n        set.attr({\"stroke\": \"#0000ff\"});\n        expect(rect1.node.getAttribute(\"stroke\")).to.be(\"#0000ff\");\n        expect(rect2.node.getAttribute(\"stroke\")).to.be(\"#000000\");\n    });\n    it(\"Set.splice - remove only\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var rect4 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2, rect3, rect4);\n        var removedSet = set.splice(1, 2);\n        expect(set.length).to.be(2);\n        expect(set[0]).to.be(rect1);\n        expect(set[1]).to.be(rect4);\n        expect(removedSet.length).to.be(2);\n        expect(removedSet[0]).to.be(rect2);\n        expect(removedSet[1]).to.be(rect3);\n        var emptySet = set.splice(0, 0);\n        expect(set.length).to.be(2);\n        expect(emptySet.length).to.be(0);\n    });\n    it(\"Set.splice - remove & insert\", function() {\n        var rect1 = s.rect(10, 20, 30, 40);\n        var rect2 = s.rect(10, 20, 30, 40);\n        var rect3 = s.rect(10, 20, 30, 40);\n        var rect4 = s.rect(10, 20, 30, 40);\n        var set = Snap.set(rect1, rect2, rect3);\n        var removedSet = set.splice(2, 1, rect4);\n        expect(set.length).to.be(3);\n        expect(set[0]).to.be(rect1);\n        expect(set[1]).to.be(rect2);\n        expect(set[2]).to.be(rect4);\n        removedSet = set.splice(0, 3, rect4, rect3, rect2, rect1);\n        expect(set[0]).to.be(rect4);\n        expect(set[1]).to.be(rect3);\n        expect(set[2]).to.be(rect2);\n        expect(set[3]).to.be(rect1);\n        expect(removedSet[0]).to.be(rect1);\n        expect(removedSet[1]).to.be(rect2);\n        expect(removedSet[2]).to.be(rect4);\n    });\n});\n"
  },
  {
    "path": "test/snap-tests.js",
    "content": "describe(\"Snap methods\", function () {\n    it(\"Snap.Matrix - six params\", function () {\n        var matrix = new Snap.Matrix(1, 2, 3, 4, 5, 6);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 2,\n            c: 3,\n            d: 4,\n            e: 5,\n            f: 6\n        });\n    });\n    it(\"Snap.Matrix - SVGMatrix param\", function () {\n        var svgMatrix = new Snap(10, 10).node.createSVGMatrix();\n        var matrix = new Snap.Matrix(svgMatrix);\n        expect(matrix).to.eql({\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: 0,\n            f: 0\n        });\n    });\n    it(\"Snap.ajax - no postData\", function(done) {\n        var xhr = Snap.ajax('./res/file-for-ajax.txt', function(xhr) {\n            var responseText = xhr.responseText;\n            expect(responseText).to.be('success');\n            expect(this.isContext).to.be(true);\n            done();\n        }, {'isContext': true});\n        expect(xhr).to.be.an('object');\n    });\n    it(\"Snap.ajax - with object postData\", function(done) {\n        var xhr = Snap.ajax('./res/file-for-ajax.txt', {foo: 'bar'}, function(xhr) {\n            var responseText = xhr.responseText;\n            expect(responseText).to.be('success');\n            expect(this.isContext).to.be(true);\n            done();\n        }, {'isContext': true});\n        expect(xhr).to.be.an('object');\n    });\n    it(\"Snap.ajax - with string postData\", function(done) {\n        var xhr = Snap.ajax('./res/file-for-ajax.txt', 'foo=bar', function(xhr) {\n            var responseText = xhr.responseText;\n            expect(responseText).to.be('success');\n            expect(this.isContext).to.be(true);\n            done();\n        }, {'isContext': true});\n        expect(xhr).to.be.an('object');\n    });\n    \n    var validateMina = function(minaObj) {\n        expect(minaObj).to.be.an('object');\n        expect(minaObj.id).to.be.a('string');\n        expect(minaObj.duration).to.be.a('function');\n        expect(minaObj.easing).to.be.a('function');\n        expect(minaObj.speed).to.be.a('function');\n        expect(minaObj.status).to.be.a('function');\n        expect(minaObj.stop).to.be.a('function');\n    };\n    \n    it(\"Snap.animate - numbers, no easing or callback\", function(done) {\n        var n;\n        var minaObj = Snap.animate(10, 20, function(newN) { n = newN; }, 50);\n        setTimeout(function() {\n            expect(n).to.be(20);\n            done();\n        }, 100);\n        validateMina(minaObj);\n    });\n   it(\"Snap.animate - numbers, callback\", function(done) {\n        var n;\n        var minaObj = Snap.animate(10, 20, function(newN) { n = newN; }, 50, function() {\n            expect(n).to.be(20);\n            done();\n        });\n        validateMina(minaObj);\n    });\n   it(\"Snap.animate - numbers, easing\", function(done) {\n        var n;\n        var minaObj = Snap.animate(10, 20, function(newN) { n = newN; }, 50, mina.easeinout);\n        setTimeout(function() {\n            expect(n).to.be(20);\n            done();\n        }, 100);\n        validateMina(minaObj);\n    });\n   it(\"Snap.animate - numbers, easing & callback\", function(done) {\n        var n;\n        var minaObj = Snap.animate(10, 20, function(newN) { n = newN; }, 50, mina.bounce, function() {\n            expect(n).to.be(20);\n            done();\n        });\n        validateMina(minaObj);\n    });\n    it(\"Snap.animate - arrays, no easing or callback\", function(done) {\n        var n1, n2;\n        var minaObj = Snap.animate([5, 10], [10, 20], function(nArr) {  n1 = nArr[0]; n2 = nArr[1]; }, 50);\n        setTimeout(function() {\n            expect(n1).to.be(10);\n            expect(n2).to.be(20);\n            done();\n        }, 100);\n        validateMina(minaObj);\n    });\n   it(\"Snap.animate - arrays, callback\", function(done) {\n        var n1, n2;\n        var minaObj = Snap.animate([5, 10], [10, 20], function(nArr) {n1 = nArr[0]; n2 = nArr[1]; }, 50, function() {\n            expect(n1).to.be(10);\n            expect(n2).to.be(20);\n            done();\n        });\n        validateMina(minaObj);\n    });\n   it(\"Snap.animate - arrays, easing\", function(done) {\n        var n1, n2;\n        var minaObj = Snap.animate([5, 10], [10, 20], function(nArr) { n1 = nArr[0]; n2 = nArr[1]; }, 50, mina.easeinout);\n        setTimeout(function() {\n            expect(n1).to.be(10);\n            expect(n2).to.be(20);\n            done();\n        }, 100);\n        validateMina(minaObj);\n    });\n    it(\"Snap.animate - arrays, easing & callback\", function(done) {\n        var n1, n2;\n        var minaObj = Snap.animate([5, 10], [10, 20], function(nArr) { n1 = nArr[0]; n2 = nArr[1]; }, 50, mina.backin, function() {\n            expect(n1).to.be(10);\n            expect(n2).to.be(20);\n            done();\n        });\n        validateMina(minaObj);\n    });\n    it(\"Snap.animation - no easing or callback\", function() {\n        var anim = Snap.animation({ foo: \"bar\" }, 100);\n        expect(anim).to.be.an(\"object\");\n        expect(anim.dur).to.be(100);\n        expect(anim.attr.foo).to.be(\"bar\");\n    });\n    it(\"Snap.animation - with easing\", function() {\n        var anim = Snap.animation({ foo: \"bar\" }, 100, mina.easein);\n        expect(anim).to.be.an(\"object\");\n        expect(anim.dur).to.be(100);\n        expect(anim.attr.foo).to.be(\"bar\");\n        expect(anim.easing).to.be.a(\"function\");\n    });\n    it(\"Snap.animation - with callback\", function() {\n        var cb = function(){};\n        var anim = Snap.animation({ foo: \"bar\" }, 100, cb);\n        expect(anim).to.be.an(\"object\");\n        expect(anim.dur).to.be(100);\n        expect(anim.attr.foo).to.be(\"bar\");\n        expect(anim.callback).to.be.a(\"function\");\n    });\n    it(\"Snap.animation - with easing & callback\", function() {\n        var cb = function(){};\n        var anim = Snap.animation({ foo: \"bar\" }, 100, mina.linear, cb);\n        expect(anim).to.be.an(\"object\");\n        expect(anim.dur).to.be(100);\n        expect(anim.attr.foo).to.be(\"bar\");\n        expect(anim.easing).to.be.a(\"function\");\n        expect(anim.callback).to.be.a(\"function\");\n        expect(anim.easing).to.not.be(anim.callback);\n    });\n    it(\"Snap.deg\", function() {\n        expect(Snap.deg(Math.PI)).to.be(180);\n        expect(Snap.deg(Math.PI / 2)).to.be(90);\n        expect(Snap.deg(Math.PI / 4)).to.be(45);\n        expect(Snap.deg(Math.PI * 2)).to.be(0);\n    });\n    it(\"Snap.rad\", function() {\n        expect(Snap.rad(180)).to.be(Math.PI);\n        expect(Snap.rad(90)).to.be(Math.PI / 2);\n        expect(Snap.rad(45)).to.be(Math.PI / 4);\n        expect(Snap.rad(0)).to.be(0);\n    });\n    it(\"Snap.format\", function() {\n        var outputStr;\n        outputStr = Snap.format(\"{x}\", {x: 1});\n        expect(outputStr).to.be(\"1\");\n        outputStr = Snap.format(\"{a['foo']}\", {\n            a: {\n                foo: 'bar'\n            }\n        });\n        expect(outputStr).to.be(\"bar\");\n        outputStr = Snap.format(\"M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z\", {\n            x: 10,\n            y: 20,\n            dim: {\n                width: 40,\n                height: 50,\n                \"negative width\": -40\n            }\n        });\n        expect(outputStr).to.be(\"M10,20h40v50h-40z\");\n    });\n    it(\"Snap.fragment\", function() {\n        var frag = Snap.fragment('<g class=\"foo\"></g>', '<g class=\"foo2\"></g>');\n        expect(frag).to.be.an(\"object\");\n        expect(frag.node.childNodes.length).to.be(2);\n        expect(frag.node.firstChild.nodeName).to.be(\"g\");\n        expect(frag.node.firstChild.getAttribute(\"class\")).to.be(\"foo\");\n        expect(frag.node.lastChild.getAttribute(\"class\")).to.be(\"foo2\");\n        frag = Snap.fragment('<g class=\"foo\"><rect x=\"0\" y=\"0\" width=\"10\" height=\"10\"/></g>');\n        var rectWidth = frag.select('rect').attr('width');\n        expect(rectWidth).to.be(\"10\");\n    });\n    it(\"Snap.is\", function() {\n        var undef;\n        expect(Snap.is(\"foo\", \"string\")).to.be.ok();\n        expect(Snap.is(123, \"number\")).to.be.ok();\n        expect(Snap.is({}, \"object\")).to.be.ok();\n        expect(Snap.is([], \"array\")).to.be.ok();\n        expect(Snap.is([], \"object\")).to.be.ok();\n        expect(Snap.is(null, \"null\")).to.be.ok();\n        expect(Snap.is(false, \"boolean\")).to.be.ok();\n        expect(Snap.is(undef, \"undefined\")).to.be.ok();\n        expect(Snap.is(function(){}, \"function\")).to.be.ok();\n        expect(Snap.is(function(){}, \"object\")).to.be.ok();\n    });\n    it(\"Snap.load - with context\", function(done) {\n        Snap.load('./res/external-svg.svg', function(fragment) {\n            expect(fragment.node.querySelector(\"svg\")).to.not.be(null);\n            expect(this.myContext).to.be(true);\n            done();\n        }, {myContext: true});\n    });\n    it(\"Snap.load - without context\", function(done) {\n        Snap.load('./res/external-svg.svg', function(fragment) {\n            expect(fragment.node.querySelector(\"svg\")).to.not.be(null);\n            done();\n        });\n    });\n    it(\"Snap.parse\", function() {\n        var frag = Snap.parse('<g class=\"foo\"></g>');\n        expect(frag).to.be.an(\"object\");\n        expect(frag.node.childNodes.length).to.be(1);\n        expect(frag.node.firstChild.nodeName).to.be(\"g\");\n        expect(frag.node.firstChild.getAttribute(\"class\")).to.be(\"foo\");\n        frag = Snap.parse('<g class=\"foo\"><rect x=\"0\" y=\"0\" width=\"10\" height=\"10\"/></g>');\n        var rectWidth = frag.select('rect').attr('width');\n        expect(rectWidth).to.be(\"10\");\n    });\n    it(\"Snap.parsePathString - string\", function() {\n        var pathArrs = Snap.parsePathString(\n            \"M1 2\" +\n            \"m3 4\" +\n            \"L 5, 6\" +\n            \"l 7, 8\" +\n            \"H 9\" +\n            \"h 10\" +\n            \"V 11\" +\n            \"v 12\" +\n            \"C 13 14, 15 16, 17 18\" +\n            \"c 19 20, 21 22, 23 24\" +\n            \"S 25 26, 27 28\" +\n            \"s 29 30, 31 32\" +\n            \"Q 33 34, 35 36\" +\n            \"q 37 38, 39 40\" +\n            \"T 41 42\" +\n            \"t 43 44\" +\n            \"A 45 46 47 0 1 48 49\" +\n            \"a 50 51 52 1 0 53 54\" +\n            \"Z\");\n        expect(pathArrs[0]).to.eql([\"M\", 1, 2]);\n        expect(pathArrs[1]).to.eql([\"m\", 3, 4]);\n        expect(pathArrs[2]).to.eql([\"L\", 5, 6]);\n        expect(pathArrs[3]).to.eql([\"l\", 7, 8]);\n        expect(pathArrs[4]).to.eql([\"H\", 9]);\n        expect(pathArrs[5]).to.eql([\"h\", 10]);\n        expect(pathArrs[6]).to.eql([\"V\", 11]);\n        expect(pathArrs[7]).to.eql([\"v\", 12]);\n        expect(pathArrs[8]).to.eql([\"C\", 13, 14, 15, 16, 17, 18]);\n        expect(pathArrs[9]).to.eql([\"c\", 19, 20, 21, 22, 23, 24]);\n        expect(pathArrs[10]).to.eql([\"S\", 25, 26, 27, 28]);\n        expect(pathArrs[11]).to.eql([\"s\", 29, 30, 31, 32]);\n        expect(pathArrs[12]).to.eql([\"Q\", 33, 34, 35, 36]);\n        expect(pathArrs[13]).to.eql([\"q\", 37, 38, 39, 40]);\n        expect(pathArrs[14]).to.eql([\"T\", 41, 42]);\n        expect(pathArrs[15]).to.eql([\"t\", 43, 44]);\n        expect(pathArrs[16]).to.eql([\"A\", 45, 46, 47, 0, 1, 48, 49]);\n        expect(pathArrs[17]).to.eql([\"a\", 50, 51, 52, 1, 0, 53, 54]);\n        expect(pathArrs[18]).to.eql([\"Z\"]);\n    });\n    it(\"Snap.parsePathString - array\", function() {\n        var pathArrs = Snap.parsePathString([\"M1 2\"]);\n        expect(pathArrs[0]).to.eql([\"M\", 1, 2]);\n    });\n    it(\"Snap.parseTransformString - string\", function() {\n        var matrix = new Snap.Matrix(1, 0, 0, 2, 0, 0);\n        var str = matrix.toTransformString();\n        var output = Snap.parseTransformString(str);\n        expect(output[0]).to.eql(['s', 1, 2, 0, 0]);\n    });\n    it(\"Snap.parseTransformString - array\", function() {\n        var output = Snap.parseTransformString(['s', 1, 2, 0, 0]);\n        expect(output[0]).to.eql(['s', 1, 2, 0, 0]);\n    });\n    it(\"Snap.select\", function() {\n        var s = Snap(10, 10);\n        var group1 = s.group();\n        var group2 = s.group();\n        var group3 = s.group();\n        var circle1 = s.circle(10, 20, 30).attr({\n            'class': 'circle-one'\n        });\n        var circle2 = s.circle(5, 10, 25).attr({\n            'class': 'circle-two'\n        });\n        group1.add(group2);\n        group2.add(group3);\n        group2.add(circle1);\n        group3.add(circle2);\n        var c1 = Snap.select('.circle-one');\n        expect(circle1).to.be(c1);\n        var c2 = Snap.select('.circle-two');\n        expect(circle2).to.be(c2);\n        s.remove();\n    });\n    it(\"Snap.selectAll\", function() {\n        var s = Snap(10, 10);\n        var group1 = s.group();\n        var group2 = s.group();\n        var group3 = s.group();\n        var circle1 = s.circle(10, 20, 30).attr({\n            'class': 'circle-one'\n        });\n        var circle2 = s.circle(5, 10, 25).attr({\n            'class': 'circle-two'\n        });\n        group1.add(group2);\n        group2.add(group3);\n        group2.add(circle1);\n        group3.add(circle2);\n        var circles = Snap.selectAll('circle');\n        expect(circles.length).to.be(2);\n        expect(circles).to.contain(circle1);\n        expect(circles).to.contain(circle2);\n        s.remove();\n    });\n    it(\"Snap.snapTo - number, no tolerance\", function() {\n        expect(Snap.snapTo(100, -5)).to.be(0);\n        expect(Snap.snapTo(100, 0.0001)).to.be(0);\n        expect(Snap.snapTo(100, 9)).to.be(0);\n        expect(Snap.snapTo(100, 50)).to.be(50);\n        expect(Snap.snapTo(100, 75)).to.be(75);\n        expect(Snap.snapTo(100, 90)).to.be(90);\n        expect(Snap.snapTo(100, 91)).to.be(100);\n        expect(Snap.snapTo(100, 95)).to.be(100);\n        expect(Snap.snapTo(100, 1204)).to.be(1200);\n    });\n    it(\"Snap.snapTo - array, no tolerance\", function() {\n        var grid = [0, 55, 200];\n        expect(Snap.snapTo(grid, -5)).to.be(0);\n        expect(Snap.snapTo(grid, 0.0001)).to.be(0);\n        expect(Snap.snapTo(grid, 9)).to.be(0);\n        expect(Snap.snapTo(grid, 50)).to.be(55);\n        expect(Snap.snapTo(grid, 75)).to.be(75);\n        expect(Snap.snapTo(grid, 90)).to.be(90);\n        expect(Snap.snapTo(grid, 91)).to.be(91);\n        expect(Snap.snapTo(grid, 195)).to.be(200);\n        expect(Snap.snapTo(grid, 1204)).to.be(1204);\n    });\n    it(\"Snap.snapTo - number, with tolerance\", function() {\n        expect(Snap.snapTo(100, 95, 0)).to.be(95);\n        expect(Snap.snapTo(100, 95, 5)).to.be(95);\n        expect(Snap.snapTo(100, 95, 6)).to.be(100);\n        expect(Snap.snapTo(100, 105, 6)).to.be(100);\n        expect(Snap.snapTo(100, 105, 5)).to.be(105);\n        expect(Snap.snapTo(100, 105, 0)).to.be(105);\n        // expect(Snap.snapTo(10, 19, 50)).to.be(20); // TODO: Find out what tolerance > grid should do\n    });\n    it(\"Snap.snapTo - array, with tolerance\", function() {\n        var grid = [0, 55, 200];\n        expect(Snap.snapTo(grid, -5, 20)).to.be(0);\n        expect(Snap.snapTo(grid, -5, 3)).to.be(-5);\n        expect(Snap.snapTo(grid, 0.0001, 0.00001)).to.be(0.0001);\n        expect(Snap.snapTo(grid, 0.0001, 1)).to.be(0);\n        expect(Snap.snapTo(grid, 9, 9)).to.be(0);\n        expect(Snap.snapTo(grid, 9, 10.5)).to.be(0);\n        expect(Snap.snapTo(grid, 50, 6)).to.be(55);\n        expect(Snap.snapTo(grid, 50, 1)).to.be(50);\n        expect(Snap.snapTo(grid, 201, 0.5)).to.be(201);\n        expect(Snap.snapTo(grid, 199, 1)).to.be(200);\n        expect(Snap.snapTo(grid, 299, 100)).to.be(200);\n    });\n    it(\"Snap.path.getBBox\", function() {\n        // same as 10,20,30,40 rect\n        var bbox = Snap.path.getBBox(\"M10,20h30v40h-30z\");\n        expect(bbox.x).to.eql(10);\n        expect(bbox.y).to.eql(20);\n        expect(bbox.width).to.eql(30);\n        expect(bbox.height).to.eql(40);\n        expect(bbox.x2).to.eql(10 + 30);\n        expect(bbox.y2).to.eql(20 + 40);\n    });\n    it(\"Snap.angle - 2 points\", function() {\n        var angle = Snap.angle(0, 0, 10, 10);\n        expect(angle).to.not.be(0);\n        expect(angle % 45).to.be(0);\n        angle = Snap.angle(0, 0, 10, 0);\n        expect(angle % 90).to.be(0);\n    });\n    it(\"Snap.angle - 3 points\", function() {\n        var angle = Snap.angle(10, 0, 0, 10, 0, 0);\n        expect(angle).to.not.be(0);\n        expect(angle % 45).to.be(0);\n        angle = Snap.angle(10, 0, 0, 10, 0, 0);\n        expect(Math.abs(angle)).to.be(90);\n    });\n});"
  },
  {
    "path": "test/system.js",
    "content": "describe(\"System check\", function () {\n    it(\"Snap exists\", function () {\n        expect(Snap).to.be.a(\"function\");\n    });\n    it(\"eve exists\", function () {\n        expect(eve).to.be.a(\"function\");\n    });\n    it(\"mina exists\", function () {\n        expect(mina).to.be.a(\"function\");\n    });\n});\n"
  },
  {
    "path": "test/test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"copyright\" content=\"Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved.\n\n Licensed under the Apache License, Version 2.0 (the “License”);\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an “AS IS” BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\">\n        <title>Snap Tests</title>\n        <style media=\"screen\">\n            svg {\n                position: absolute;\n                top: 0;\n                left: 0;\n            }\n        </style>\n        <link rel=\"stylesheet\" href=\"../node_modules/mocha/mocha.css\">\n        <script src=\"../dist/snap.svg.js\"></script>\n    </head>\n    <body>\n        <div id=\"mocha\"></div>\n        <script src=\"../node_modules/expect.js/index.js\"></script>\n        <script src=\"../node_modules/mocha/mocha.js\"></script>\n        <script>mocha.setup(\"bdd\");</script>\n        <script src=\"system.js\"></script>\n        <script src=\"paper.js\"></script>\n        <script src=\"snap-tests.js\"></script>\n        <script src=\"class.js\"></script>\n        <script src=\"primitives.js\"></script>\n        <script src=\"colors.js\"></script>\n        <script src=\"attrs.js\"></script>\n        <script src=\"attradd.js\"></script>\n        <script src=\"path.js\"></script>\n        <script src=\"element.js\"></script>\n        <script src=\"gradients.js\"></script>\n        <script src=\"set.js\"></script>\n        <script src=\"filter.js\"></script>\n        <script src=\"matrix.js\"></script>\n        <script src=\"mina.js\"></script>\n        <svg id=\"svgroot\"></svg>\n        <script>\n            mocha.checkLeaks();\n            mocha.run();\n        </script>\n    </body>\n</html>\n"
  },
  {
    "path": "test/test.js",
    "content": "var page = require(\"webpage\").create();\n\npage.open(\"test.html\", function (status) {\n    var errors = 0;\n    if (status === \"success\") {\n        errors = page.evaluate(function () {\n            return +document.querySelector(\"li.failures em\").innerText;\n        });\n        console.log(errors);\n    }\n    phantom.exit(errors);\n});\n"
  }
]